void FEndPhysicsTickFunction::ExecuteTick(float DeltaTime, enum ELevelTick TickType, ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent) { check(Target); FPhysScene* PhysScene = Target->GetPhysicsScene(); if (PhysScene == NULL) { return; } FGraphEventRef PhysicsComplete = PhysScene->GetCompletionEvent(); if (PhysicsComplete.GetReference() && !PhysicsComplete->IsComplete()) { // don't release the next tick group until the physics has completed and we have run FinishPhysicsSim DECLARE_CYCLE_STAT(TEXT("FSimpleDelegateGraphTask.FinishPhysicsSim"), STAT_FSimpleDelegateGraphTask_FinishPhysicsSim, STATGROUP_TaskGraphTasks); MyCompletionGraphEvent->DontCompleteUntil( FSimpleDelegateGraphTask::CreateAndDispatchWhenReady( FSimpleDelegateGraphTask::FDelegate::CreateUObject(Target, &UWorld::FinishPhysicsSim), GET_STATID(STAT_FSimpleDelegateGraphTask_FinishPhysicsSim), PhysicsComplete, ENamedThreads::GameThread ) ); } else { // it was already done, so let just do it. Target->FinishPhysicsSim(); } }
void FEndPhysicsTickFunction::ExecuteTick(float DeltaTime, enum ELevelTick TickType, ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent) { QUICK_SCOPE_CYCLE_COUNTER(FEndPhysicsTickFunction_ExecuteTick); check(Target); FPhysScene* PhysScene = Target->GetPhysicsScene(); if (PhysScene == NULL) { return; } FGraphEventRef PhysicsComplete = PhysScene->GetCompletionEvent(); if (PhysicsComplete.GetReference() && !PhysicsComplete->IsComplete()) { // don't release the next tick group until the physics has completed and we have run FinishPhysicsSim DECLARE_CYCLE_STAT(TEXT("FSimpleDelegateGraphTask.FinishPhysicsSim"), STAT_FSimpleDelegateGraphTask_FinishPhysicsSim, STATGROUP_TaskGraphTasks); MyCompletionGraphEvent->DontCompleteUntil( FSimpleDelegateGraphTask::CreateAndDispatchWhenReady( FSimpleDelegateGraphTask::FDelegate::CreateUObject(Target, &UWorld::FinishPhysicsSim), GET_STATID(STAT_FSimpleDelegateGraphTask_FinishPhysicsSim), PhysicsComplete, ENamedThreads::GameThread ) ); } else { // it was already done, so let just do it. Target->FinishPhysicsSim(); } #if PHYSX_MEMORY_VALIDATION static int32 Frequency = 0; if (Frequency++ > 10) { Frequency = 0; GPhysXAllocator->ValidateHeaders(); } #endif }