void UWorld::ResetAsyncTrace() { AsyncTraceData& DataBufferExecuted = AsyncTraceState.GetBufferForPreviousFrame(); // Wait for thread WaitForAllAsyncTraceTasks(); // do run delegates before starting next round for (int32 Idx = 0; Idx != DataBufferExecuted.NumQueuedTraceData; ++Idx) { auto& TraceData = FBufferIndexPair(Idx).DatumLookupChecked(DataBufferExecuted.TraceData); TraceData.Delegate.ExecuteIfBound(FTraceHandle(TraceData.FrameNumber, Idx), TraceData); } for (int32 Idx = 0; Idx != DataBufferExecuted.NumQueuedOverlapData; ++Idx) { auto& TraceData = FBufferIndexPair(Idx).DatumLookupChecked(DataBufferExecuted.OverlapData); TraceData.Delegate.ExecuteIfBound(FTraceHandle(TraceData.FrameNumber, Idx), TraceData); } }
void UWorld::ResetAsyncTrace() { AsyncTraceData& DataBufferExecuted = AsyncTraceState.GetBufferForPreviousFrame(); // Wait for thread WaitForAllAsyncTraceTasks(); // do run delegates before starting next round for (int32 Idx = 0; Idx != AsyncTraceState.NextAvailableTraceIndex; ++Idx) { auto& TraceData = FBufferIndexPair(Idx).DatumLookupChecked(DataBufferExecuted.TraceData); TraceData.Delegate.ExecuteIfBound(FTraceHandle(TraceData.FrameNumber, Idx), TraceData); } for (int32 Idx = 0; Idx != AsyncTraceState.NextAvailableOverlapIndex; ++Idx) { auto& TraceData = FBufferIndexPair(Idx).DatumLookupChecked(DataBufferExecuted.OverlapData); TraceData.Delegate.ExecuteIfBound(FTraceHandle(TraceData.FrameNumber, Idx), TraceData); } // re-initialize all variables AsyncTraceState.GetBufferForCurrentFrame().bAsyncAllowed = true; AsyncTraceState.NextAvailableTraceIndex = 0; AsyncTraceState.NextAvailableOverlapIndex = 0; }