vault backup: 2025-07-14 22:20:22
This commit is contained in:
parent
990d1ff0bc
commit
7a7ce4a596
@ -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++
|
||||
void AShaderWorldActor::CollisionCPU()
|
||||
|
Loading…
x
Reference in New Issue
Block a user