Skip to content

Commit cdadeba

Browse files
committed
Reduced GC allocations for mesh creation/updates, Hovercast, and throughout.
1 parent 6896efb commit cdadeba

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+613
-462
lines changed

Core/Solution/Hover.Board/Display/Standard/UiHoverMeshRect.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,18 @@ public override void UpdateHoverPoints(IBaseItemPointsState pPointsState) {
6969

7070
////////////////////////////////////////////////////////////////////////////////////////////////
7171
/*--------------------------------------------------------------------------------------------*/
72-
protected override void UpdateMesh(MeshType pType, Mesh pMesh, float pAmount=1) {
72+
protected override void UpdateMesh(MeshType pType, MeshBuilder pMeshBuild, float pAmount=1) {
7373
if ( pType == MeshType.Edge ) {
74-
MeshUtil.BuildBorderMesh(pMesh, vMeshW, vMeshH, EdgeThick);
74+
MeshUtil.BuildBorderMesh(pMeshBuild, vMeshW, vMeshH, EdgeThick);
75+
pMeshBuild.Commit();
7576
return;
7677
}
7778

7879
float inset = (pType != MeshType.Background ? EdgeThick*2 : 0);
7980

80-
MeshUtil.BuildRectangleMesh(pMesh, Math.Max(0, vMeshW-inset),
81+
MeshUtil.BuildRectangleMesh(pMeshBuild, Math.Max(0, vMeshW-inset),
8182
Math.Max(0, vMeshH-inset), pAmount);
83+
pMeshBuild.Commit();
8284
}
8385

8486
/*--------------------------------------------------------------------------------------------*/

Core/Solution/Hover.Board/Display/Standard/UiHoverMeshRectBg.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ public override void UpdateHoverPoints(IBaseItemPointsState pPointsState) {
7171

7272
////////////////////////////////////////////////////////////////////////////////////////////////
7373
/*--------------------------------------------------------------------------------------------*/
74-
protected override void UpdateMesh(MeshType pType, Mesh pMesh, float pAmount=1) {
75-
MeshUtil.BuildRectangleMesh(pMesh, vMeshW, vMeshH, pAmount);
74+
protected override void UpdateMesh(MeshType pType, MeshBuilder pMeshBuild, float pAmount=1) {
75+
MeshUtil.BuildRectangleMesh(pMeshBuild, vMeshW, vMeshH, pAmount);
76+
pMeshBuild.Commit();
7677
}
7778

7879
/*--------------------------------------------------------------------------------------------*/

Core/Solution/Hover.Board/Display/Standard/UiItemBaseIconRenderer.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace Hover.Board.Display.Standard {
1111
public abstract class UiItemBaseIconRenderer : UiItemSelectRenderer {
1212

1313
protected GameObject vIcon;
14-
protected Mesh vIconMesh;
14+
protected MeshBuilder vIconMeshBuilder;
1515

1616
private int vPrevTextSize;
1717
private bool vIsSizeChanged;
@@ -47,10 +47,12 @@ public override void Build(IHoverboardPanelState pPanelState,
4747
vIcon.AddComponent<MeshRenderer>();
4848

4949
MeshFilter iconFilt = vIcon.AddComponent<MeshFilter>();
50-
vIconMesh = iconFilt.mesh;
51-
MeshUtil.BuildQuadMesh(vIconMesh);
52-
Materials.SetMeshColor(vIconMesh, Color.clear);
53-
Materials.SetMeshIconCoords(vIconMesh, GetIconOffset());
50+
vIconMeshBuilder = new MeshBuilder();
51+
MeshUtil.BuildQuadMesh(vIconMeshBuilder);
52+
Materials.SetMeshIconCoords(vIconMeshBuilder, GetIconOffset());
53+
vIconMeshBuilder.Commit();
54+
vIconMeshBuilder.CommitColors(Color.clear);
55+
iconFilt.sharedMesh = vIconMeshBuilder.Mesh;
5456
}
5557

5658
/*--------------------------------------------------------------------------------------------*/
@@ -75,7 +77,7 @@ public override void Update() {
7577
Color color = vSettings.ArrowIconColor;
7678
color.a *= (vItemState.MaxHighlightProgress*0.75f + 0.25f)*vMainAlpha;
7779

78-
Materials.SetMeshColor(vIconMesh, color);
80+
vIconMeshBuilder.CommitColors(color);
7981

8082
if ( vSettings.TextSize != vPrevTextSize || vIsSizeChanged ) {
8183
vPrevTextSize = vSettings.TextSize;

Core/Solution/Hover.Board/Display/Standard/UiItemBaseToggleRenderer.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public abstract class UiItemBaseToggleRenderer : UiItemSelectRenderer {
1212

1313
protected GameObject vOuter;
1414
protected GameObject vInner;
15-
protected Mesh vOuterMesh;
16-
protected Mesh vInnerMesh;
15+
protected MeshBuilder vOuterMeshBuilder;
16+
protected MeshBuilder vInnerMeshBuilder;
1717

1818
private int vPrevTextSize;
1919

@@ -47,10 +47,12 @@ public override void Build(IHoverboardPanelState pPanelState,
4747
vOuter.AddComponent<MeshRenderer>();
4848

4949
MeshFilter outerFilt = vOuter.AddComponent<MeshFilter>();
50-
vOuterMesh = outerFilt.mesh;
51-
MeshUtil.BuildQuadMesh(vOuterMesh);
52-
Materials.SetMeshColor(vOuterMesh, Color.clear);
53-
Materials.SetMeshIconCoords(vOuterMesh, GetOuterIconOffset());
50+
vOuterMeshBuilder = new MeshBuilder();
51+
MeshUtil.BuildQuadMesh(vOuterMeshBuilder);
52+
Materials.SetMeshIconCoords(vOuterMeshBuilder, GetOuterIconOffset());
53+
vOuterMeshBuilder.Commit();
54+
vOuterMeshBuilder.CommitColors(Color.clear);
55+
outerFilt.sharedMesh = vOuterMeshBuilder.Mesh;
5456

5557
////
5658

@@ -59,11 +61,13 @@ public override void Build(IHoverboardPanelState pPanelState,
5961
vInner.transform.localRotation = vLabel.CanvasLocalRotation;
6062
vInner.AddComponent<MeshRenderer>();
6163

62-
MeshFilter iconFilt = vInner.AddComponent<MeshFilter>();
63-
vInnerMesh = iconFilt.mesh;
64-
MeshUtil.BuildQuadMesh(vInnerMesh);
65-
Materials.SetMeshColor(vInnerMesh, Color.clear);
66-
Materials.SetMeshIconCoords(vInnerMesh, GetInnerIconOffset());
64+
MeshFilter innerFilt = vInner.AddComponent<MeshFilter>();
65+
vInnerMeshBuilder = new MeshBuilder();
66+
MeshUtil.BuildQuadMesh(vInnerMeshBuilder);
67+
Materials.SetMeshIconCoords(vInnerMeshBuilder, GetInnerIconOffset());
68+
vInnerMeshBuilder.Commit();
69+
vInnerMeshBuilder.CommitColors(Color.clear);
70+
innerFilt.sharedMesh = vInnerMeshBuilder.Mesh;
6771
}
6872

6973
/*--------------------------------------------------------------------------------------------*/
@@ -83,8 +87,8 @@ public override void Update() {
8387
Color color = vSettings.ToggleIconColor;
8488
color.a *= (vItemState.MaxHighlightProgress*0.25f + 0.75f)*vMainAlpha;
8589

86-
Materials.SetMeshColor(vOuterMesh, color);
87-
Materials.SetMeshColor(vInnerMesh, color);
90+
vOuterMeshBuilder.CommitColors(color);
91+
vInnerMeshBuilder.CommitColors(color);
8892
vInner.SetActive(IsToggled());
8993

9094
if ( vSettings.TextSize != vPrevTextSize ) {

Core/Solution/Hover.Board/Display/Standard/UiItemSliderRenderer.cs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
32
using Hover.Board.Custom.Standard;
43
using Hover.Board.State;
54
using Hover.Common.Custom;
@@ -36,9 +35,11 @@ public class UiItemSliderRenderer : MonoBehaviour, IUiItemRenderer {
3635

3736
protected UiHoverMeshRectBg vHiddenRect;
3837
protected UiItemSliderTrackRenderer vTrack;
38+
protected ReadList<DisplayUtil.TrackSegment> vTrackSegments;
39+
protected ReadList<DisplayUtil.TrackSegment> vTrackCuts;
3940

4041
protected GameObject[] vTicks;
41-
protected Mesh vTickMesh;
42+
protected MeshBuilder vTickMeshBuilder;
4243

4344
protected GameObject vGrabHold;
4445
protected UiItemSliderGrabRenderer vGrab;
@@ -88,16 +89,19 @@ public virtual void Build(IHoverboardPanelState pPanelState,
8889
trackObj.transform.localPosition = new Vector3(-vWidth/2, 0, 0);
8990

9091
vTrack = new UiItemSliderTrackRenderer(trackObj);
92+
vTrackSegments = new ReadList<DisplayUtil.TrackSegment>();
93+
vTrackCuts = new ReadList<DisplayUtil.TrackSegment>();
9194

9295
////
9396

9497
if ( vSliderItem.Ticks > 1 ) {
9598
Vector3 quadScale = new Vector3(UiHoverMeshRect.SizeInset*2, 0.36f, 0.1f);
9699
float percPerTick = 1/(float)(vSliderItem.Ticks-1);
97100

98-
vTickMesh = new Mesh();
99-
MeshUtil.BuildQuadMesh(vTickMesh);
100-
Materials.SetMeshColor(vTickMesh, Color.clear);
101+
vTickMeshBuilder = new MeshBuilder();
102+
MeshUtil.BuildQuadMesh(vTickMeshBuilder);
103+
vTickMeshBuilder.Commit();
104+
vTickMeshBuilder.CommitColors(Color.clear);
101105

102106
for ( int i = 0 ; i < vSliderItem.Ticks ; ++i ) {
103107
GameObject tickObj = new GameObject("Tick"+i);
@@ -108,7 +112,7 @@ public virtual void Build(IHoverboardPanelState pPanelState,
108112
tickObj.AddComponent<MeshRenderer>();
109113

110114
MeshFilter tickFilt = tickObj.AddComponent<MeshFilter>();
111-
tickFilt.sharedMesh = vTickMesh;
115+
tickFilt.sharedMesh = vTickMeshBuilder.Mesh;
112116

113117
vTicks[i] = tickObj;
114118
}
@@ -189,8 +193,8 @@ public virtual void Update() {
189193

190194
vTrack.SetColors(colTrack, colFill);
191195

192-
if ( vTickMesh != null ) {
193-
Materials.SetMeshColor(vTickMesh, colTick);
196+
if ( vTickMeshBuilder != null ) {
197+
vTickMeshBuilder.CommitColors(colTick);
194198
}
195199

196200
////
@@ -236,8 +240,8 @@ public virtual void UpdateHoverPoints(IBaseItemPointsState pPointsState,
236240
////////////////////////////////////////////////////////////////////////////////////////////////
237241
/*--------------------------------------------------------------------------------------------*/
238242
protected virtual void UpdateMeshes(float pValue, float pHoverValue, float pHoverW) {
239-
var segs = new List<DisplayUtil.TrackSegment>();
240-
var cuts = new List<DisplayUtil.TrackSegment>();
243+
vTrackSegments.Clear();
244+
vTrackCuts.Clear();
241245

242246
float halfGrabW = vGrabW/2;
243247
float valCenter = pValue*vSlideW + halfGrabW;
@@ -249,46 +253,46 @@ protected virtual void UpdateMeshes(float pValue, float pHoverValue, float pHove
249253
float break0 = Math.Min(zeroCenter, valCenter);
250254
float break1 = Math.Max(zeroCenter, valCenter);
251255

252-
segs.Add(new DisplayUtil.TrackSegment {
256+
vTrackSegments.Add(new DisplayUtil.TrackSegment {
253257
StartValue = 0,
254258
EndValue = break0
255259
});
256260

257-
segs.Add(new DisplayUtil.TrackSegment {
261+
vTrackSegments.Add(new DisplayUtil.TrackSegment {
258262
StartValue = break0,
259263
EndValue = break1,
260264
IsFill = true,
261265
IsZeroAtStart = (break0 == zeroCenter)
262266
});
263267

264-
segs.Add(new DisplayUtil.TrackSegment {
268+
vTrackSegments.Add(new DisplayUtil.TrackSegment {
265269
StartValue = break1,
266270
EndValue = vWidth
267271
});
268272
}
269273
else {
270274
bool isMinStart = (vSliderItem.FillStartingPoint == SliderItem.FillType.MinimumValue);
271275

272-
segs.Add(new DisplayUtil.TrackSegment {
276+
vTrackSegments.Add(new DisplayUtil.TrackSegment {
273277
StartValue = 0,
274278
EndValue = valCenter,
275279
IsFill = isMinStart
276280
});
277281

278-
segs.Add(new DisplayUtil.TrackSegment {
282+
vTrackSegments.Add(new DisplayUtil.TrackSegment {
279283
StartValue = valCenter,
280284
EndValue = vWidth,
281285
IsFill = !isMinStart
282286
});
283287
}
284288

285-
cuts.Add(new DisplayUtil.TrackSegment {
289+
vTrackCuts.Add(new DisplayUtil.TrackSegment {
286290
StartValue = valCenter - halfGrabW,
287291
EndValue = valCenter + halfGrabW,
288292
});
289293

290294
if ( pHoverW > 0 && !isHoverTooClose ) {
291-
cuts.Add(new DisplayUtil.TrackSegment {
295+
vTrackCuts.Add(new DisplayUtil.TrackSegment {
292296
StartValue = hovCenter - pHoverW/2,
293297
EndValue = hovCenter + pHoverW/2,
294298
});
@@ -299,7 +303,7 @@ protected virtual void UpdateMeshes(float pValue, float pHoverValue, float pHove
299303
vHover.UpdateSize(0, 0);
300304
}
301305

302-
vTrack.UpdateSegments(segs.ToArray(), cuts.ToArray(), vHeight*0.92f);
306+
vTrack.UpdateSegments(vTrackSegments.ReadOnly, vTrackCuts.ReadOnly, vHeight*0.92f);
303307
}
304308

305309
}

Core/Solution/Hover.Board/Display/Standard/UiItemSliderTrackRenderer.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Collections.Generic;
2+
using System.Collections.ObjectModel;
13
using System.Linq;
24
using Hover.Common.Display;
35
using UnityEngine;
@@ -10,6 +12,7 @@ public class UiItemSliderTrackRenderer {
1012
protected readonly UiHoverMeshRectBg[] vTracks;
1113
protected readonly UiHoverMeshRectBg[] vFills;
1214
protected readonly UiHoverMeshRectBg[] vAllBgs;
15+
protected readonly List<DisplayUtil.TrackSegment> vSlices;
1316

1417

1518
////////////////////////////////////////////////////////////////////////////////////////////////
@@ -27,6 +30,7 @@ public UiItemSliderTrackRenderer(GameObject pParent) {
2730
}
2831

2932
vAllBgs = vTracks.Concat(vFills).ToArray();
33+
vSlices = new List<DisplayUtil.TrackSegment>();
3034
}
3135

3236

@@ -52,9 +56,9 @@ public virtual void SetColors(Color pTrackColor, Color pFillColor) {
5256

5357
////////////////////////////////////////////////////////////////////////////////////////////////
5458
/*--------------------------------------------------------------------------------------------*/
55-
public virtual void UpdateSegments(DisplayUtil.TrackSegment[] pSegments,
56-
DisplayUtil.TrackSegment[] pCuts, float pHeight) {
57-
DisplayUtil.TrackSegment[] slices = DisplayUtil.SplitTrackSegments(pSegments, pCuts);
59+
public virtual void UpdateSegments(ReadOnlyCollection<DisplayUtil.TrackSegment> pSegments,
60+
ReadOnlyCollection<DisplayUtil.TrackSegment> pCuts, float pHeight) {
61+
DisplayUtil.SplitTrackSegments(pSegments, pCuts, vSlices);
5862

5963
foreach ( UiHoverMeshRectBg bg in vAllBgs ) {
6064
bg.Show(false);
@@ -63,7 +67,7 @@ public virtual void UpdateSegments(DisplayUtil.TrackSegment[] pSegments,
6367
int trackI = 0;
6468
int fillI = 0;
6569

66-
foreach ( DisplayUtil.TrackSegment slice in slices ) {
70+
foreach ( DisplayUtil.TrackSegment slice in vSlices ) {
6771
UiHoverMeshRectBg bg;
6872

6973
if ( slice.IsFill ) {

Core/Solution/Hover.Board/Display/Standard/UiProjectionRenderer.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ public class UiProjectionRenderer : MonoBehaviour, IUiProjectionRenderer {
1515
protected ProjectionVisualSettingsStandard vSettings;
1616
protected GameObject vSpotObj;
1717
protected GameObject vLineObj;
18-
protected Mesh vSpotMesh;
19-
protected Mesh vLineMesh;
18+
protected MeshBuilder vSpotMeshBuilder;
19+
protected MeshBuilder vLineMeshBuilder;
2020

2121

2222
////////////////////////////////////////////////////////////////////////////////////////////////
@@ -33,8 +33,9 @@ public virtual void Build(ProjectionState pProjectionState,
3333
vSpotObj.transform.localScale = Vector3.zero;
3434

3535
MeshFilter spotFilt = vSpotObj.AddComponent<MeshFilter>();
36-
MeshUtil.BuildCircleMesh(spotFilt.mesh, 0.5f, 32);
37-
vSpotMesh = spotFilt.mesh;
36+
vSpotMeshBuilder = new MeshBuilder(spotFilt.mesh);
37+
MeshUtil.BuildCircleMesh(vSpotMeshBuilder, 0.5f, 32);
38+
vSpotMeshBuilder.Commit();
3839

3940
MeshRenderer spotRend = vSpotObj.AddComponent<MeshRenderer>();
4041
spotRend.sharedMaterial =
@@ -46,7 +47,8 @@ public virtual void Build(ProjectionState pProjectionState,
4647
vLineObj.name = "Line";
4748
vLineObj.transform.SetParent(gameObject.transform, false);
4849
vLineObj.transform.localScale = Vector3.zero;
49-
vLineMesh = vLineObj.GetComponent<MeshFilter>().mesh;
50+
51+
vLineMeshBuilder = new MeshBuilder(vLineObj.GetComponent<MeshFilter>().mesh);
5052

5153
MeshRenderer lineRend = vLineObj.GetComponent<MeshRenderer>();
5254
lineRend.sharedMaterial =
@@ -69,10 +71,10 @@ public virtual void Update() {
6971
colSpot.a *= alphaMult;
7072
colLine.a *= alphaMult;
7173

72-
Materials.SetMeshColor(vSpotMesh, colSpot);
74+
vSpotMeshBuilder.CommitColors(colSpot);
7375
vSpotObj.transform.localScale = spotScale;
7476

75-
Materials.SetMeshColor(vLineMesh, colLine);
77+
vLineMeshBuilder.CommitColors(colLine);
7678
vLineObj.transform.localScale = new Vector3(lineThick, dist, lineThick);
7779
vLineObj.transform.localPosition = new Vector3(0, vLineObj.transform.localScale.y/2f, 0);
7880
}

Core/Solution/Hover.Board/State/HoverboardState.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ private struct ItemTree {
3131
private readonly ListMap<CursorType, ProjectionState> vProjectionMap;
3232
private readonly ItemTree[] vAllItems;
3333

34-
private List<ItemTree> vActiveItems;
35-
private ReadList<IBaseItemInteractionState> vActiveCursorInteractions;
36-
private ReadList<PlaneData> vActiveCursorPlanes;
34+
private readonly List<ItemTree> vActiveItems;
35+
private readonly ReadList<IBaseItemInteractionState> vActiveCursorInteractions;
36+
private readonly ReadList<PlaneData> vActiveCursorPlanes;
3737

3838

3939
////////////////////////////////////////////////////////////////////////////////////////////////
@@ -91,14 +91,18 @@ public IHovercursorState Hovercursor {
9191
}
9292

9393
/*--------------------------------------------------------------------------------------------*/
94-
public IRadioItem[] GetRadioSiblings(IRadioItem pSelectedItem) {
95-
var siblings = new List<IRadioItem>();
94+
public IList<IRadioItem> GetRadioSiblings(IRadioItem pSelectedItem) {
95+
var siblings = new List<IRadioItem>(); //GC_ALLOC
9696
string id = pSelectedItem.GroupId;
9797

98-
foreach ( IHoverboardPanelState panel in Panels ) {
99-
foreach ( IHoverboardLayoutState layout in panel.Layouts ) {
100-
foreach ( IBaseItemState item in layout.Items ) {
101-
IRadioItem radItem = (item.Item as IRadioItem);
98+
for ( int panelI = 0 ; panelI < FullPanels.Length ; panelI++ ) {
99+
IHoverboardPanelState panel = FullPanels[panelI];
100+
101+
for ( int layoutI = 0 ; layoutI < panel.Layouts.Count ; layoutI++ ) {
102+
IHoverboardLayoutState layout = panel.Layouts[layoutI];
103+
104+
for ( int itemI = 0 ; itemI < layout.Items.Count ; itemI++ ) {
105+
IRadioItem radItem = (layout.Items[itemI].Item as IRadioItem);
102106

103107
if ( radItem == null || radItem == pSelectedItem || radItem.GroupId != id ) {
104108
continue;
@@ -109,7 +113,7 @@ public IRadioItem[] GetRadioSiblings(IRadioItem pSelectedItem) {
109113
}
110114
}
111115

112-
return siblings.ToArray();
116+
return siblings;
113117
}
114118

115119
/*--------------------------------------------------------------------------------------------*/

0 commit comments

Comments
 (0)