Move Memory Copy Handling from Main Thread to Render Thread

This commit is contained in:
copecone committed 2026-05-29 12:03:03 +09:00
1 parent 459b2f3b0e
commit 036216c006
2 files changed
+68 -25

No files matched your search

+18 -14
View File
@@ -91,28 +91,32 @@ namespace ADOFAIRenderer.Util
var byteSize = state.NativeBuffer.Length;
var blackFrame = ArrayPool<byte>.Shared.Rent(byteSize);
Array.Clear(blackFrame, 0, byteSize);
PushToQueue(frame, blackFrame);
var capFrame = new RenderManager.CapturedFrame
{
ManagedBuffer = blackFrame,
Length = byteSize
};
PushToQueue(frame, capFrame);
RecycleState(state);
}
else
{
unsafe
{
var ptr = state.NativeBuffer.GetUnsafeReadOnlyPtr();
var rawBytes = FFmpegProcess.RentRawBytes(state.NativeBuffer.Length);
fixed (byte* destPtr = rawBytes)
var ptr = (IntPtr)state.NativeBuffer.GetUnsafeReadOnlyPtr();
var capFrame = new RenderManager.CapturedFrame
{
Buffer.MemoryCopy(ptr, destPtr, rawBytes.Length, state.NativeBuffer.Length);
}
PushToQueue(frame, rawBytes);
NativePointer = ptr,
Length = state.NativeBuffer.Length,
ReadbackState = state
};
PushToQueue(frame, capFrame);
}
}
RecycleState(state);
}
private void RecycleState(ReadbackRequestState state)
internal void RecycleState(ReadbackRequestState state)
{
lock (_poolLock)
{
@@ -127,12 +131,12 @@ namespace ADOFAIRenderer.Util
}
}
private static void PushToQueue(long frame, byte[] rawBytes)
private static void PushToQueue(long frame, RenderManager.CapturedFrame capturedFrame)
{
if (!RenderManager.Instance) return;
lock (RenderManager.Instance.ImageQueue)
{
RenderManager.Instance.ImageQueue[frame] = rawBytes;
RenderManager.Instance.ImageQueue[frame] = capturedFrame;
}
}