diff --git a/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md b/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md index a646555..5a4a5b0 100644 --- a/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md +++ b/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md @@ -155,7 +155,7 @@ void AShaderWorldActor::ReadbacksManagement() ### CollisionManagement() - ThreadSafe - bool - - bProcessingGroundCollision + - ***bProcessingGroundCollision***:处理地面碰撞。 - bPreprocessingCollisionUpdate - EditRebuild:传递Bool值给 rebuild。 - FSWCollisionManagementShareableData @@ -310,8 +310,8 @@ bool AShaderWorldActor::SetupCollisions() } ``` -#### CollisionFinalizeWork() -结束碰撞生成任务,true为完成,false为任务超时未完成。 +#### CollisionFinalizeWork() 笔记为3.8.6版本非最新 +结束碰撞生成任务,true为完成,false为任务超时未完成。**主要的逻辑是将之前的数据设置为脏,并且更新FShaderWProceduralMeshSceneProxy,5.4 Finaly版本里这里已经移除了碰撞相关逻辑** - TMap CollisionMesh:碰撞Name => 碰撞Mesh Map。 - FCollisionMeshElement:管理单个碰撞数据的结构体。 - UBodySetup:虚幻引擎中一个重要的物理相关类,主要用于定义和存储物体的物理属性和碰撞设置 @@ -455,6 +455,8 @@ void UShaderWorldCollisionComponent::UpdateSectionTriMesh(TSharedPtrGetProcMeshSection(0) = nullptr") } - CollisionReadToProcess.RemoveAt(CollID); } } - + //回读队列处理完毕后之后执行后续逻辑 if (!CollisionReadToProcess.IsEmpty()) { return false; } - + //开始执行碰撞处理队列逻辑 CollisionReadToProcess.Empty(); - if (CollisionWorkQueue.Num() > 0) { (*bProcessingGroundCollision.Get()) = true; AShaderWorldActor* SWContext = this; - + //异步并行 反序列化Ground碰撞数据 Async(EAsyncExecution::TaskGraph, [Completion = bProcessingGroundCollision, RenderAPI = RendererAPI, VerticesPerPatch = CollisionVerticesPerPatch, Work = CollisionWorkQueue] { @@ -541,6 +541,7 @@ bool AShaderWorldActor::CollisionPreprocessGPU() FVector LocationfVertice_WS(0); uint16 MaterialIndice = 0; + //取得从GPU回读的序列化数据 uint8* ReadData8 = (uint8*)WorkEl.Read->ReadData.GetData(); TSet& TrianglesAffectedByHoles = WorkEl.DestB->TrianglesAffectedByHoles; @@ -559,7 +560,7 @@ bool AShaderWorldActor::CollisionPreprocessGPU() } #else - + //从对序列化碰撞Z轴数据进行反序列化,还原成double,再之后还原成FCollisionProcessingWork.DestB for (int32 k = 0; k < NumOfVertex; k++) { @@ -600,6 +601,7 @@ bool AShaderWorldActor::CollisionPreprocessGPU() #endif /* * If the terrain has holes, create a custom index buffer with the related triangles removed + * 地形挖洞,碰撞逻辑处理。 */ if(TrianglesAffectedByHoles.Num() > 0) { @@ -627,6 +629,7 @@ bool AShaderWorldActor::CollisionPreprocessGPU() } ); + //执行完成后将Completion(bProcessingGroundCollision)设置为false代表处理完成。 if (Completion.IsValid()) Completion->AtomicSet(false); @@ -638,6 +641,20 @@ bool AShaderWorldActor::CollisionPreprocessGPU() ``` +### +```c++ +void AShaderWorldActor::CollisionCPU() +{ + SCOPED_NAMED_EVENT_TEXT("AShaderWorldActor::CollisionCPU()", FColor::Magenta); + SW_FCT_CYCLE() + + if ((*bPreprocessingCollisionUpdate.Get()) || + CollisionShareable->CollisionMeshToUpdate.Num() > 0 || + CollisionShareable->CollisionMeshToRenameMoveUpdate.Num() > 0 || + CollisionShareable->CollisionMeshToCreate.Num() > 0) + return; +``` + ### SpawnablesManagement() ### TerrainAndSpawnablesManagement()