Skip to content

Commit 069daf5

Browse files
[Core] Adjust ExpandableContainer to use Span<T>;
[Core] Adjust similar situations to use ExpandableContainer;
1 parent 70b46aa commit 069daf5

File tree

9 files changed

+69
-202
lines changed

9 files changed

+69
-202
lines changed

Engine/Core/Audio/AudioSystem.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,9 +347,9 @@ public void Update()
347347
}
348348
}
349349

350-
for(var i = 0; i < removedAudioSources.Length; i++)
350+
foreach(var source in removedAudioSources.Contents)
351351
{
352-
audioSources.Remove(removedAudioSources.Contents[i]);
352+
audioSources.Remove(source);
353353
}
354354
}
355355

Engine/Core/Rendering/Animation/SkinnedMeshRenderSystem.cs

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,10 @@ private struct RenderInfo
4141
public ushort viewID;
4242
}
4343

44-
private RenderInfo[] renderers = [];
45-
46-
private int rendererCount = 0;
44+
private readonly ExpandableContainer<RenderInfo> renderers = new();
4745

4846
private readonly Dictionary<int, Matrix4x4[]> cachedBoneMatrices = [];
4947

50-
private readonly object lockObject = new();
51-
5248
public void Destroy()
5349
{
5450
}
@@ -63,12 +59,7 @@ public void Preprocess((Entity, Transform, IComponent)[] entities, Camera active
6359

6460
public void Process((Entity, Transform, IComponent)[] entities, Camera activeCamera, Transform activeCameraTransform, ushort viewId)
6561
{
66-
if(entities.Length != renderers.Length)
67-
{
68-
Array.Resize(ref renderers, entities.Length);
69-
}
70-
71-
var index = 0;
62+
renderers.Clear();
7263

7364
foreach (var (entity, transform, relatedComponent) in entities)
7465
{
@@ -96,12 +87,13 @@ public void Process((Entity, Transform, IComponent)[] entities, Camera activeCam
9687

9788
renderer.animator ??= new(entity, EntityQueryMode.Parent, false);
9889

99-
renderers[index].renderer = renderer;
100-
renderers[index].position = transform.Position;
101-
renderers[index].transform = transform.Matrix;
102-
renderers[index].viewID = viewId;
103-
104-
index++;
90+
renderers.Add(new()
91+
{
92+
renderer = renderer,
93+
position = transform.Position,
94+
transform = transform.Matrix,
95+
viewID = viewId
96+
});
10597

10698
var animator = renderer.animator.Content;
10799
var mesh = renderer.mesh;
@@ -112,23 +104,20 @@ public void Process((Entity, Transform, IComponent)[] entities, Camera activeCam
112104

113105
Matrix4x4[] boneMatrices = null;
114106

115-
lock(lockObject)
107+
if (useAnimator)
116108
{
117-
if (useAnimator)
109+
if((animator?.cachedBoneMatrices?.Length ?? 0) == 0)
118110
{
119-
if((animator?.cachedBoneMatrices?.Length ?? 0) == 0)
120-
{
121-
animator.cachedBoneMatrices = new Matrix4x4[meshAsset.BoneCount];
122-
}
123-
124-
boneMatrices = animator.cachedBoneMatrices;
111+
animator.cachedBoneMatrices = new Matrix4x4[meshAsset.BoneCount];
125112
}
126-
else if (cachedBoneMatrices.TryGetValue(meshAsset.Guid.GetHashCode(), out boneMatrices) == false)
127-
{
128-
boneMatrices = new Matrix4x4[meshAsset.BoneCount];
129113

130-
cachedBoneMatrices.Add(meshAsset.Guid.GetHashCode(), boneMatrices);
131-
}
114+
boneMatrices = animator.cachedBoneMatrices;
115+
}
116+
else if (cachedBoneMatrices.TryGetValue(meshAsset.Guid.GetHashCode(), out boneMatrices) == false)
117+
{
118+
boneMatrices = new Matrix4x4[meshAsset.BoneCount];
119+
120+
cachedBoneMatrices.Add(meshAsset.Guid.GetHashCode(), boneMatrices);
132121
}
133122

134123
if (renderer.cachedNodes.Count != renderer.mesh.submeshes.Count)
@@ -213,8 +202,6 @@ public void Process((Entity, Transform, IComponent)[] entities, Camera activeCam
213202
}
214203
}
215204
}
216-
217-
rendererCount = index;
218205
}
219206

220207
public Type RelatedComponent()
@@ -235,10 +222,8 @@ public void Submit()
235222

236223
bgfx.discard((byte)bgfx.DiscardFlags.All);
237224

238-
for(var i = 0; i < rendererCount; i++)
225+
foreach(var pair in renderers.Contents)
239226
{
240-
var pair = renderers[i];
241-
242227
var renderer = pair.renderer;
243228
var mesh = renderer.mesh;
244229
var meshAsset = mesh.meshAsset;

Engine/Core/Rendering/Mesh/MeshRenderSystem.cs

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Bgfx;
22
using System;
3-
using System.Collections.Generic;
43
using System.Numerics;
54

65
namespace Staple.Internal;
@@ -36,9 +35,7 @@ private struct RenderInfo
3635
public ushort viewID;
3736
}
3837

39-
private RenderInfo[] renderers = [];
40-
41-
private int rendererCount = 0;
38+
private readonly ExpandableContainer<RenderInfo> renderers = new();
4239

4340
/// <summary>
4441
/// Renders a mesh
@@ -152,12 +149,7 @@ public void Preprocess((Entity, Transform, IComponent)[] entities, Camera active
152149

153150
public void Process((Entity, Transform, IComponent)[] entities, Camera activeCamera, Transform activeCameraTransform, ushort viewId)
154151
{
155-
if(renderers.Length < entities.Length)
156-
{
157-
Array.Resize(ref renderers, entities.Length);
158-
}
159-
160-
var index = 0;
152+
renderers.Clear();
161153

162154
foreach (var (_, transform, relatedComponent) in entities)
163155
{
@@ -184,15 +176,14 @@ public void Process((Entity, Transform, IComponent)[] entities, Camera activeCam
184176
continue;
185177
}
186178

187-
renderers[index].renderer = r;
188-
renderers[index].position = transform.Position;
189-
renderers[index].transform = transform.Matrix;
190-
renderers[index].viewID = viewId;
191-
192-
index++;
179+
renderers.Add(new()
180+
{
181+
renderer = r,
182+
position = transform.Position,
183+
transform = transform.Matrix,
184+
viewID = viewId
185+
});
193186
}
194-
195-
rendererCount = index;
196187
}
197188

198189
public Type RelatedComponent()
@@ -211,10 +202,8 @@ public void Submit()
211202

212203
Material lastMaterial = null;
213204

214-
for(var i = 0; i < rendererCount; i++)
205+
foreach(var pair in renderers.Contents)
215206
{
216-
var pair = renderers[i];
217-
218207
void DrawMesh(int index)
219208
{
220209
var material = pair.renderer.materials[index];

Engine/Core/Rendering/Text/TextRenderer.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public Rect MeasureTextSimple(string str, TextParameters parameters)
9696
var min = Vector2Int.Zero;
9797
var max = Vector2Int.Zero;
9898

99-
var lines = str.Replace("\r", "").Split(['\n']);
99+
var lines = str.Replace("\r", "").Split('\n');
100100
var first = true;
101101

102102
for(var i = 0; i < lines.Length; i++)
@@ -319,7 +319,7 @@ public bool MakeTextGeometry(string text, TextParameters parameters, float scale
319319

320320
var initialPosition = position;
321321

322-
var lines = text.Replace("\r", "").Split(['\n']);
322+
var lines = text.Replace("\r", "").Split('\n');
323323

324324
vertexCache.Clear();
325325
indexCache.Clear();
@@ -430,8 +430,8 @@ public bool MakeTextGeometry(string text, TextParameters parameters, float scale
430430
position.Y += lineSpace;
431431
}
432432

433-
vertices = vertexCache.Contents.AsSpan(0, vertexCache.Length);
434-
indices = indexCache.Contents.AsSpan(0, indexCache.Length);
433+
vertices = vertexCache.Contents;
434+
indices = indexCache.Contents;
435435

436436
return true;
437437
}

Engine/Core/StapleCore.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,6 @@
196196
<Compile Include="UI\UIImage.cs" />
197197
<Compile Include="UI\UIText.cs" />
198198
<Compile Include="Utilities\CallbackGatherer.cs" />
199-
<Compile Include="Utilities\ConcurrentExpandableArray.cs" />
200199
<Compile Include="Utilities\CubicMeshBuilder.cs" />
201200
<Compile Include="Rendering\Mesh\MeshAsset.cs" />
202201
<Compile Include="Rendering\Animation\SkinnedMeshAnimationEvaluator.cs" />

Engine/Core/System/SubsystemManager.cs

Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,19 @@ internal class SubsystemManager
1616

1717
private readonly SortedDictionary<byte, HashSet<ISubsystem>> subsystems = [];
1818
private bool needsRecalculation = true;
19-
private ISubsystem[] final;
20-
private readonly object lockObject = new();
19+
private readonly ExpandableContainer<ISubsystem> collapsedSystems = new();
2120

2221
/// <summary>
2322
/// Destroys each subsystem
2423
/// </summary>
2524
internal void Destroy()
2625
{
27-
lock(lockObject)
26+
//Shutdown in reverse order
27+
foreach (var key in subsystems.Keys.Reverse())
2828
{
29-
//Shutdown in reverse order
30-
foreach (var key in subsystems.Keys.Reverse())
29+
foreach (var subsystem in subsystems[key])
3130
{
32-
foreach (var subsystem in subsystems[key])
33-
{
34-
subsystem?.Shutdown();
35-
}
31+
subsystem?.Shutdown();
3632
}
3733
}
3834
}
@@ -44,26 +40,23 @@ internal void Destroy()
4440
/// <param name="priority">The priority</param>
4541
public void RegisterSubsystem(ISubsystem subsystem, byte priority)
4642
{
47-
lock(lockObject)
43+
if (subsystems.TryGetValue(priority, out var list) == false)
4844
{
49-
if (subsystems.TryGetValue(priority, out var list) == false)
50-
{
51-
list = [];
45+
list = [];
5246

53-
subsystems.Add(priority, list);
54-
}
47+
subsystems.Add(priority, list);
48+
}
5549

56-
list.Add(subsystem);
50+
list.Add(subsystem);
5751

58-
subsystem.Startup();
52+
subsystem.Startup();
5953

60-
if(subsystem is IWorldChangeReceiver worldChangeReceiver)
61-
{
62-
World.AddChangeReceiver(worldChangeReceiver);
63-
}
64-
65-
needsRecalculation = true;
54+
if(subsystem is IWorldChangeReceiver worldChangeReceiver)
55+
{
56+
World.AddChangeReceiver(worldChangeReceiver);
6657
}
58+
59+
needsRecalculation = true;
6760
}
6861

6962
/// <summary>
@@ -76,41 +69,25 @@ internal void Update(SubsystemType type)
7669
{
7770
needsRecalculation = false;
7871

79-
var systemCount = 0;
80-
81-
foreach(var pair in subsystems)
82-
{
83-
systemCount += pair.Value.Count;
84-
}
85-
86-
Array.Resize(ref final, systemCount);
87-
88-
var index = 0;
72+
collapsedSystems.Clear();
8973

9074
foreach(var pair in subsystems)
9175
{
9276
foreach(var subsystem in pair.Value)
9377
{
94-
final[index++] = subsystem;
78+
collapsedSystems.Add(subsystem);
9579
}
9680
}
9781
}
9882

99-
lock (lockObject)
83+
foreach(var subsystem in collapsedSystems.Contents)
10084
{
101-
var l = final.Length;
102-
103-
for(var i = 0; i < l; i++)
85+
if(subsystem.type != type)
10486
{
105-
var subsystem = final[i];
106-
107-
if(subsystem.type != type)
108-
{
109-
continue;
110-
}
111-
112-
subsystem.Update();
87+
continue;
11388
}
89+
90+
subsystem.Update();
11491
}
11592
}
11693
}

Engine/Core/UI/UICanvasSystem.cs

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ private struct RenderInfo
2222

2323
private static MouseButton[] MouseButtons = Enum.GetValues<MouseButton>();
2424

25-
private RenderInfo[] renders = [];
26-
27-
private int renderCount = 0;
25+
private readonly ExpandableContainer<RenderInfo> renders = new();
2826

2927
public delegate void ObserverCallback(Vector2Int position, Vector2Int size, UIElement element);
3028

@@ -44,12 +42,7 @@ public void Preprocess((Entity, Transform, IComponent)[] entities, Camera active
4442

4543
public void Process((Entity, Transform, IComponent)[] entities, Camera activeCamera, Transform activeCameraTransform, ushort viewId)
4644
{
47-
if (renders.Length < entities.Length)
48-
{
49-
Array.Resize(ref renders, entities.Length);
50-
}
51-
52-
var index = 0;
45+
renders.Clear();
5346

5447
foreach (var (_, transform, relatedComponent) in entities)
5548
{
@@ -58,23 +51,21 @@ public void Process((Entity, Transform, IComponent)[] entities, Camera activeCam
5851
continue;
5952
}
6053

61-
renders[index].canvas = canvas;
62-
renders[index].canvasTransform = transform;
63-
renders[index].projection = Matrix4x4.CreateOrthographicOffCenter(0, Screen.Width, Screen.Height, 0, -1, 1);
64-
65-
index++;
54+
renders.Add(new()
55+
{
56+
canvas = canvas,
57+
canvasTransform = transform,
58+
projection = Matrix4x4.CreateOrthographicOffCenter(0, Screen.Width, Screen.Height, 0, -1, 1)
59+
});
6660
}
67-
68-
renderCount = index;
6961
}
7062

7163
public Type RelatedComponent() => typeof(UICanvas);
7264

7365
public void Submit()
7466
{
75-
for(var i = 0; i < renderCount; i++)
67+
foreach(var render in renders.Contents)
7668
{
77-
var render = renders[i];
7869
var view = Matrix4x4.Identity;
7970
var projection = render.projection;
8071

0 commit comments

Comments
 (0)