phase(N.4): WbMeshAdapter.Tick — drain WB pipeline queues per frame
Without this, ObjectMeshManager.StagedMeshData and OpenGLGraphicsDevice._glThreadQueue grow unbounded as background workers prep mesh data + queue GL actions. Visual stress test of flag-on at radius 7 showed real FPS drop and rising frame latency from this leak. Tick() drains both queues: 1. _graphicsDevice.ProcessGLQueue() applies pending GL state. 2. Loop _meshManager.StagedMeshData.TryDequeue -> UploadMeshData to materialize VAO/VBO/IBO for each prepared mesh. Wired into GameWindow's render loop before draw work begins. No-op when adapter is uninitialized or disposed. Pattern matches WB's reference ObjectRenderManagerBase.ProcessUploads without the prioritization heuristics (we're not yet drawing the results — Task 22's WbDrawDispatcher will add prioritization when visual budget matters). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
f4f0101d2c
commit
bf53cb4fce
3 changed files with 54 additions and 0 deletions
|
|
@ -46,4 +46,20 @@ public sealed class WbMeshAdapterTests
|
|||
var adapter = WbMeshAdapter.CreateUninitialized();
|
||||
Assert.Null(adapter.GetRenderData(0x01000001ul));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tick_OnUninitializedAdapter_DoesNotThrow()
|
||||
{
|
||||
var adapter = WbMeshAdapter.CreateUninitialized();
|
||||
adapter.Tick(); // no-op, no throw
|
||||
adapter.Tick(); // idempotent
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tick_AfterDispose_DoesNotThrow()
|
||||
{
|
||||
var adapter = WbMeshAdapter.CreateUninitialized();
|
||||
adapter.Dispose();
|
||||
adapter.Tick(); // no-op, no throw
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue