feat(core,rendering)!: add cleanup component support, refactor render pipeline

Introduce ICleanupComponent and cleanup archetype logic in ECS. Refactor component versioning to uint. Update IResourceDatabase to use map/unmap pattern. Decouple per-frame render requests from RenderSystem via IRenderPayload. Update render pipeline and extraction system to new API.

BREAKING CHANGE: Entity destruction and render pipeline APIs have changed. IResourceDatabase.MapResource signature is updated; all callers must use map/memcpy/unmap. RenderSystem no longer manages per-frame render requests directly.
This commit is contained in:
2026-04-06 22:05:48 +09:00
parent c6bdbe0710
commit 6c96d4cf50
20 changed files with 399 additions and 200 deletions

View File

@@ -0,0 +1,54 @@
using Ghost.Graphics.Core;
using Ghost.Graphics.RenderPipeline;
using Misaki.HighPerformance.LowLevel.Buffer;
using Misaki.HighPerformance.LowLevel.Collections;
namespace Ghost.Graphics.Test.RenderPipeline;
internal sealed class TestRenderPayload : IRenderPayload
{
public class FrameData
{
public UnsafeList<RenderRequest> renderRequests;
}
private readonly RenderSystem _renderSystem;
private readonly FrameData[] _frameData;
public RenderSystem RenderSystem => _renderSystem;
public ReadOnlySpan<FrameData> FrameRequestData => _frameData;
public TestRenderPayload(RenderSystem renderSystem)
{
_renderSystem = renderSystem;
_frameData = new FrameData[renderSystem.MaxFrameLatency];
for (int i = 0; i < _frameData.Length; i++)
{
_frameData[i].renderRequests = new UnsafeList<RenderRequest>(2, Allocator.Persistent);
}
}
public void AddRenderRequest(RenderRequest request)
{
var index = (int)(_renderSystem.CPUFenceValue % (uint)_frameData.Length);
_frameData[index].renderRequests.Add(request);
}
public void Dispose()
{
for (int i = 0; i < _frameData.Length; i++)
{
_frameData[i].renderRequests.Dispose();
}
}
}
internal sealed class TestRenderPipelineSettings : IRenderPipelineSettings
{
public void CreatePipeline(RenderSystem renderSystem, out IRenderPipeline renderPipeline, out IRenderPayload renderPayload)
{
renderPipeline = new TestRenderPipeline(renderSystem);
renderPayload = new TestRenderPayload(renderSystem);
}
}