Skip to content

Commit 0dd74a2

Browse files
committed
refactor: streamline buffer disposal and clearing methods
1 parent 3fbec88 commit 0dd74a2

File tree

8 files changed

+79
-159
lines changed

8 files changed

+79
-159
lines changed

source/RevitDevTool/Visualization/Render/RenderingBufferStorage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace RevitDevTool.Visualization.Render;
44

55
#nullable disable
6-
public sealed class RenderingBufferStorage
6+
public sealed class RenderingBufferStorage : IDisposable
77
{
88
public VertexFormatBits FormatBits { get; set; }
99
public int PrimitiveCount { get; set; }

source/RevitDevTool/Visualization/Server/BoundingBoxVisualizationServer.cs

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -143,18 +143,8 @@ public override void RenderScene(Autodesk.Revit.DB.View view, DisplayStyle displ
143143

144144
private void MapGeometryBuffer()
145145
{
146-
foreach (var buffer in _surfaceBuffers)
147-
{
148-
buffer.Dispose();
149-
}
150-
151-
foreach (var buffer in _edgeBuffers)
152-
{
153-
buffer.Dispose();
154-
}
155-
156-
_surfaceBuffers.Clear();
157-
_edgeBuffers.Clear();
146+
_surfaceBuffers.Clear(true);
147+
_edgeBuffers.Clear(true);
158148

159149
if (VisualizeGeometries.Count == 0) return;
160150

@@ -181,11 +171,7 @@ private void MapGeometryBuffer()
181171

182172
private void MapAxisBuffers()
183173
{
184-
foreach (var buffer in _axisBuffers)
185-
{
186-
buffer.Dispose();
187-
}
188-
_axisBuffers.Clear();
174+
_axisBuffers.Clear(true);
189175

190176
foreach (var box in VisualizeGeometries)
191177
{
@@ -235,23 +221,8 @@ private void UpdateEffects()
235221

236222
protected override void DisposeBuffers()
237223
{
238-
foreach (var buffer in _surfaceBuffers)
239-
{
240-
buffer.Dispose();
241-
}
242-
243-
foreach (var buffer in _edgeBuffers)
244-
{
245-
buffer.Dispose();
246-
}
247-
248-
foreach (var buffer in _axisBuffers)
249-
{
250-
buffer.Dispose();
251-
}
252-
253-
_surfaceBuffers.Clear();
254-
_edgeBuffers.Clear();
255-
_axisBuffers.Clear();
224+
_surfaceBuffers.Clear(true);
225+
_edgeBuffers.Clear(true);
226+
_axisBuffers.Clear(true);
256227
}
257228
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// ReSharper disable once CheckNamespace
2+
namespace RevitDevTool.Visualization.Server;
3+
4+
[PublicAPI]
5+
public static class EnumerableExtensions
6+
{
7+
public static void Dispose<T>(this IEnumerable<T?>? items) where T : IDisposable
8+
{
9+
if (items is null) return;
10+
foreach (var item in items)
11+
{
12+
item?.Dispose();
13+
}
14+
}
15+
16+
public static void Dispose<T>(this T?[]? items) where T : IDisposable
17+
{
18+
if (items is null) return;
19+
foreach (var item in items)
20+
{
21+
item?.Dispose();
22+
}
23+
}
24+
25+
public static void Clear<T>(this ICollection<T>? items, bool dispose = false) where T : IDisposable
26+
{
27+
if (items is null) return;
28+
29+
if (dispose)
30+
{
31+
items.Dispose();
32+
}
33+
34+
items.Clear();
35+
}
36+
37+
public static void Clear<T>(this ICollection<T[]> items, bool dispose = false) where T : IDisposable
38+
{
39+
if (dispose)
40+
{
41+
foreach (var item in items)
42+
{
43+
item.Dispose();
44+
}
45+
}
46+
items.Clear();
47+
}
48+
}

source/RevitDevTool/Visualization/Server/FaceVisualizationServer.cs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -200,23 +200,8 @@ private void UpdateEffects()
200200

201201
protected override void DisposeBuffers()
202202
{
203-
foreach (var buffer in _surfaceBuffers)
204-
{
205-
buffer.Dispose();
206-
}
207-
208-
foreach (var buffer in _meshGridBuffers)
209-
{
210-
buffer.Dispose();
211-
}
212-
213-
foreach (var buffer in _normalBuffers)
214-
{
215-
buffer.Dispose();
216-
}
217-
218-
_surfaceBuffers.Clear();
219-
_meshGridBuffers.Clear();
220-
_normalBuffers.Clear();
203+
_surfaceBuffers.Clear(true);
204+
_meshGridBuffers.Clear(true);
205+
_normalBuffers.Clear(true);
221206
}
222207
}

source/RevitDevTool/Visualization/Server/MeshVisualizationServer.cs

Lines changed: 11 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -122,18 +122,8 @@ public override void RenderScene(Autodesk.Revit.DB.View view, DisplayStyle displ
122122

123123
private void MapGeometryBuffer()
124124
{
125-
foreach (var buffer in _surfaceBuffers)
126-
{
127-
buffer.Dispose();
128-
}
129-
130-
foreach (var buffer in _meshGridBuffers)
131-
{
132-
buffer.Dispose();
133-
}
134-
135-
_surfaceBuffers.Clear();
136-
_meshGridBuffers.Clear();
125+
_surfaceBuffers.Clear(true);
126+
_meshGridBuffers.Clear(true);
137127

138128
if (VisualizeGeometries.Count == 0) return;
139129

@@ -160,27 +150,24 @@ private void MapGeometryBuffer()
160150

161151
private void MapNormalsBuffer()
162152
{
163-
foreach (var buffer in _normalBuffers.SelectMany(bufferArray => bufferArray))
164-
{
165-
buffer.Dispose();
166-
}
167-
_normalBuffers.Clear();
153+
_normalBuffers.Clear(true);
168154

169155
foreach (var mesh in VisualizeGeometries)
170156
{
171157
var area = RenderGeometryHelper.ComputeMeshSurfaceArea(mesh);
172158
var offset = RenderGeometryHelper.InterpolateOffsetByArea(area);
173159
var normalLength = RenderGeometryHelper.InterpolateAxisLengthByArea(area);
174160

175-
RenderingBufferStorage[] normals = [];
161+
var normals = Enumerable.Range(0, mesh.Vertices.Count)
162+
.Select(_ => new RenderingBufferStorage())
163+
.ToArray();
164+
176165
for (var i = 0; i < mesh.Vertices.Count; i++)
177166
{
178167
var vertex = mesh.Vertices[i];
179-
var buffer = new RenderingBufferStorage();
168+
var buffer = normals[i];
180169
var normal = RenderGeometryHelper.GetMeshVertexNormal(mesh, i, mesh.DistributionOfNormals);
181-
182170
RenderHelper.MapNormalVectorBuffer(buffer, vertex + normal * (offset + _extrusion), normal, normalLength);
183-
normals = normals.Append(buffer).ToArray();
184171
}
185172

186173
_normalBuffers.Add(normals);
@@ -214,23 +201,8 @@ private void UpdateEffects()
214201

215202
protected override void DisposeBuffers()
216203
{
217-
foreach (var buffer in _surfaceBuffers)
218-
{
219-
buffer.Dispose();
220-
}
221-
222-
foreach (var buffer in _meshGridBuffers)
223-
{
224-
buffer.Dispose();
225-
}
226-
227-
foreach (var buffer in _normalBuffers.SelectMany(bufferArray => bufferArray))
228-
{
229-
buffer.Dispose();
230-
}
231-
232-
_surfaceBuffers.Clear();
233-
_meshGridBuffers.Clear();
234-
_normalBuffers.Clear();
204+
_surfaceBuffers.Clear(true);
205+
_meshGridBuffers.Clear(true);
206+
_normalBuffers.Clear(true);
235207
}
236208
}

source/RevitDevTool/Visualization/Server/PolylineVisualizationServer.cs

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -117,18 +117,8 @@ public override void RenderScene(Autodesk.Revit.DB.View view, DisplayStyle displ
117117

118118
private void MapGeometryBuffer()
119119
{
120-
foreach (var buffer in _surfaceBuffers)
121-
{
122-
buffer.Dispose();
123-
}
124-
125-
foreach (var buffer in _curveBuffers)
126-
{
127-
buffer.Dispose();
128-
}
129-
130-
_surfaceBuffers.Clear();
131-
_curveBuffers.Clear();
120+
_surfaceBuffers.Clear(true);
121+
_curveBuffers.Clear(true);
132122

133123
if (VisualizeGeometries.Count == 0) return;
134124

@@ -163,12 +153,7 @@ private void MapGeometryBuffer()
163153

164154
private void MapDirectionsBuffer()
165155
{
166-
foreach (var buffer in _normalsBuffers)
167-
{
168-
buffer.Dispose();
169-
}
170-
171-
_normalsBuffers.Clear();
156+
_normalsBuffers.Clear(true);
172157

173158
if (VisualizeGeometries.Count == 0) return;
174159

@@ -245,23 +230,8 @@ private void UpdateEffects()
245230

246231
protected override void DisposeBuffers()
247232
{
248-
foreach (var buffer in _surfaceBuffers)
249-
{
250-
buffer.Dispose();
251-
}
252-
253-
foreach (var buffer in _curveBuffers)
254-
{
255-
buffer.Dispose();
256-
}
257-
258-
foreach (var buffer in _normalsBuffers)
259-
{
260-
buffer.Dispose();
261-
}
262-
263-
_surfaceBuffers.Clear();
264-
_curveBuffers.Clear();
265-
_normalsBuffers.Clear();
233+
_surfaceBuffers.Clear(true);
234+
_curveBuffers.Clear(true);
235+
_normalsBuffers.Clear(true);
266236
}
267237
}

source/RevitDevTool/Visualization/Server/SolidVisualizationServer.cs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,7 @@ private void UpdateEffects()
170170

171171
protected override void DisposeBuffers()
172172
{
173-
foreach (var buffer in _faceBuffers)
174-
{
175-
buffer.Dispose();
176-
}
177-
178-
foreach (var buffer in _edgeBuffers)
179-
{
180-
buffer.Dispose();
181-
}
182-
183-
_faceBuffers.Clear();
184-
_edgeBuffers.Clear();
173+
_faceBuffers.Clear(true);
174+
_edgeBuffers.Clear(true);
185175
}
186176
}

source/RevitDevTool/Visualization/Server/XyzVisualizationServer.cs

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -230,23 +230,7 @@ private void UpdateEffects()
230230

231231
protected override void DisposeBuffers()
232232
{
233-
foreach (var bufferArray in _planeBufferArrays)
234-
{
235-
foreach (var buffer in bufferArray)
236-
{
237-
buffer.Dispose();
238-
}
239-
}
240-
241-
foreach (var bufferArray in _axisBufferArrays)
242-
{
243-
foreach (var buffer in bufferArray)
244-
{
245-
buffer.Dispose();
246-
}
247-
}
248-
249-
_axisBufferArrays.Clear();
250-
_planeBufferArrays.Clear();
233+
_axisBufferArrays.Clear(true);
234+
_planeBufferArrays.Clear(true);
251235
}
252236
}

0 commit comments

Comments
 (0)