vault backup: 2025-07-14 22:20:22

This commit is contained in:
BlueRose 2025-07-14 22:20:22 +08:00
parent 990d1ff0bc
commit 7a7ce4a596

View File

@ -641,6 +641,157 @@ bool AShaderWorldActor::CollisionPreprocessGPU()
``` ```
#### CollisionGPU()
```c++
void AShaderWorldActor::CollisionGPU()
{
SCOPED_NAMED_EVENT_TEXT("AShaderWorldActor::CollisionGPU()", FColor::Magenta);
SW_FCT_CYCLE()
double CurrentTime = FPlatformTime::Seconds();
if (!(!(*bPreprocessingCollisionUpdate.Get()) && (
CollisionShareable->CollisionMeshToUpdate.Num() > 0 ||
CollisionShareable->CollisionMeshToRenameMoveUpdate.Num() > 0 ||
CollisionShareable->CollisionMeshToCreate.Num() > 0)))
{
/*
* No collision Preprocessing running, we can safely access the data in the shared pointer without risking race condition
* 确保没有PreprocessingCollision任务在运行
*/
if(!(*bPreprocessingCollisionUpdate.Get()))
{
FScopeLock CollisionMeshArrayAccess(CollisionMeshAccessLock.Get());
TArray<FName> NameToRemove;
//遍历AvailableCollisionMesh
for (const FName& AvailableID : CollisionShareable->AvailableCollisionMesh)
{
FCollisionMeshElement& Elem = *CollisionMesh.Find(AvailableID);
//更新时间戳
if (Elem.SleepTime < 0.0)
Elem.SleepTime = CurrentTime;
else if ((abs(CurrentTime - Elem.SleepTime) >= 1.0) && (CollisionBufferHolder == "" || AvailableID != CollisionBufferHolder) && (!Elem.Mesh || (Elem.Mesh && !Elem.Mesh->HasAsyncWorkPending())))
{
if (IsValid(Elem.Mesh))
Elem.Mesh->DestroyComponent();
Elem.Mesh = nullptr;
DecountRTAllocatedMemory(Elem.CollisionRT)
DecountRTAllocatedMemory(Elem.CollisionRT_Duplicate)
Elem.CollisionRT = nullptr;
Elem.CollisionRT_Duplicate = nullptr;
Elem.DynCollisionCompute = nullptr;
Elem.LayerComputeForPhysicalMaterial.Empty();
CollisionMesh.Remove(AvailableID);
if (UsedCollisionMesh.Contains(AvailableID))
{
UsedCollisionMesh.Remove(AvailableID);
}
CollisionShareable->CollisionMeshData.Remove(AvailableID);
CollisionShareable->UsedCollisionMesh.Remove(AvailableID);
NameToRemove.Add(AvailableID);
}
else
{
}
}
for (auto& TR : NameToRemove)
{
CollisionShareable->AvailableCollisionMesh.Remove(TR);
}
}
return;
}
UWorld* World = GetWorld();
bool RequireRenderFence = false;
int32 CollisionDrawCallCount = 0;
UsedCollisionMesh = CollisionShareable->UsedCollisionMesh;
/*
* Async task created proxy CollisionMesh and associated IDs to them, create actual GameThread collision using the provided IDs
*/
for (FName& ID : CollisionShareable->CollisionMeshToCreate)
{
const FSWCollisionMeshElemData& Mesh_Shareable = *CollisionShareable->CollisionMeshData.Find(ID);
FCollisionMeshElement& Mesh = GetACollisionMesh(ID);
Mesh.Location = Mesh_Shareable.Location;
Mesh.MeshLocation = Mesh_Shareable.MeshLocation;
Mesh.Mesh->SetWorldTransform(FTransform(Mesh_Shareable.MeshLocation));
Mesh.Mesh->SetCollisionProfileName(UCollisionProfile::BlockAll_ProfileName);
Mesh.Mesh->Mobility = EComponentMobility::Static;
}
CollisionShareable->CollisionMeshToCreate.Empty();
for (int i = CollisionShareable->CollisionMeshToUpdate.Num() - 1; i >= 0; i--)
{
FName& CollisionIDToUpdate = CollisionShareable->CollisionMeshToUpdate[i];
FCollisionMeshElement& El = *CollisionMesh.Find(CollisionIDToUpdate);
UpdateCollisionMeshData(El);
CollisionShareable->CollisionMeshToUpdate.RemoveAt(i);
RequireRenderFence = true;
CollisionDrawCallCount++;
if (CollisionDrawCallCount >= CollisionMaxDrawCallPerFrame)
break;
}
for (int i = CollisionShareable->CollisionMeshToRenameMoveUpdate.Num() - 1; i >= 0; i--)
{
FName& CollisionIDToUpdate = CollisionShareable->CollisionMeshToRenameMoveUpdate[i];
ensure(CollisionMesh.Find(CollisionIDToUpdate) != nullptr);
ensure(CollisionShareable->CollisionMeshData.Find(CollisionIDToUpdate) != nullptr);
FCollisionMeshElement& El = *CollisionMesh.Find(CollisionIDToUpdate);
const FSWCollisionMeshElemData& El_Shareable = *CollisionShareable->CollisionMeshData.Find(CollisionIDToUpdate);
El.Location = El_Shareable.Location;
El.MeshLocation = El_Shareable.MeshLocation;
El.Mesh->SetLocationOnPhysicCookComplete(El.MeshLocation);
UpdateCollisionMeshData(El);
CollisionShareable->CollisionMeshToRenameMoveUpdate.RemoveAt(i);
RequireRenderFence = true;
CollisionDrawCallCount++;
if (CollisionDrawCallCount >= CollisionMaxDrawCallPerFrame)
break;
}
if (RequireRenderFence)
{
CollisionProcess.BeginFence();
}
}
```
### ###
```c++ ```c++
void AShaderWorldActor::CollisionCPU() void AShaderWorldActor::CollisionCPU()