vault backup: 2025-07-14 17:51:44

This commit is contained in:
2025-07-14 17:51:44 +08:00
parent 6d9b688f0f
commit 990d1ff0bc

View File

@@ -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<FName,FCollisionMeshElement> CollisionMesh碰撞Name => 碰撞Mesh Map。
- FCollisionMeshElement管理单个碰撞数据的结构体。
- UBodySetup虚幻引擎中一个重要的物理相关类主要用于定义和存储物体的物理属性和碰撞设置
@@ -455,6 +455,8 @@ void UShaderWorldCollisionComponent::UpdateSectionTriMesh(TSharedPtr<FSWShareabl
#### CollisionPreprocessGPU()
GPU生成碰撞 的预处理阶段。
将从GPU回读的碰撞顶点Z轴数据***uint8* ReadData8*** 反序列化成double之后再还原成***FCollisionProcessingWork.DestB***的Positions、Normals、Positions3f、MaterialIndices、Bound。
```c++
bool AShaderWorldActor::CollisionPreprocessGPU()
{
@@ -499,26 +501,24 @@ bool AShaderWorldActor::CollisionPreprocessGPU()
{
SW_LOG("CollisionPreprocessGPU :: Mesh.Mesh->GetProcMeshSection(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<int32>& 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()
}
);
//执行完成后将CompletionbProcessingGroundCollision设置为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()