diff --git a/03-UnrealEngine/Rendering/RenderFeature/FRenderCommandFence.md b/03-UnrealEngine/Rendering/RenderFeature/FRenderCommandFence.md index 4b3578f..5e639bd 100644 --- a/03-UnrealEngine/Rendering/RenderFeature/FRenderCommandFence.md +++ b/03-UnrealEngine/Rendering/RenderFeature/FRenderCommandFence.md @@ -20,13 +20,14 @@ rating: ⭐ --- ### 关键方法 -- **`BeginFence()`** - 在渲染命令队列中插入一个“栅栏标记”,表示同步点。调用后游戏线程可以继续执行其他任务。 +- **`BeginFence(bool bSyncToRHIAndGPU = false)`** + - 在渲染命令队列中插入一个“栅栏标记”,表示同步点。调用后游戏线程可以继续执行其他任务。 + - `bSyncToRHIAndGPU` - 是否等待 RHI 线程或 GPU,否则只等待渲染线程。 - **`Wait(bool bProcessGameThreadTasks = false)`** - 阻塞游戏线程,直到渲染线程处理到栅栏位置(即执行完栅栏之前的所有渲染命令)。 - `bProcessGameThreadTasks`: 若为 `true`,等待期间允许游戏线程处理其他任务(如消息泵)。 - **`IsFenceComplete()`** - 非阻塞检查栅栏是否已完成(渲染线程是否已越过栅栏点)。 + - 非阻塞检查栅栏是否已完成(渲染线程是否已越过栅栏点)。 --- diff --git a/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md b/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md index 78eecdc..9add123 100644 --- a/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md +++ b/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md @@ -154,6 +154,63 @@ void AShaderWorldActor::ReadbacksManagement() ``` ### CollisionManagement() +```c++ +void AShaderWorldActor::CollisionManagement(float& DeltaT) +{ + SCOPED_NAMED_EVENT_TEXT("AShaderWorldActor::CollisionManagement", FColor::Magenta); + SW_FCT_CYCLE() + + /* + * Can we execute compute shader? + * Do we need to rebuild collision? + * Did ShaderWorld toggled collision generation On/Off? + * Are we pending a full rebuild of the Shader World? + */ + if (!SetupCollisions()) + return; + + /* + * Using collision updates, update Collision meshes + */ + if (!CollisionFinalizeWork()) + return; + + if (CollisionProcess.IsFenceComplete()) + { + /* + * Convert Compute shader results to actionable collision updates + */ + if (!CollisionPreprocessGPU()) + { + CollisionProcess.BeginFence(true); + return; + } + } + + /* + * Process GPU work queue by launching GPU tasks to evaluate the collision of new tiles + */ + CollisionGPU(); + + // Timer + { + CollisionUpdateTimeAcu += DeltaT; + + if (CollisionUpdateTimeAcu <= 1.f / 10.f || CollisionWorkQueue.Num() > 0 || !CollisionProcess.IsFenceComplete()) + return; + + CollisionUpdateTimeAcu = 0.f; + } + + /* + * Gather relevant collision tiles + * If an old tile is not relevant anymore, release it. + * If a new location needs to be computed: allocate a tile and add its relevant computation work to the GPU work queue + */ + CollisionCPU(); +} +``` +#### SetupCollisions() ### SpawnablesManagement()