From 6bd4a8975e56202e65006a6771a76b40f5ccf69a2f59f7f84aa2b864ddcf6e5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4DELTA?= Date: Mon, 1 Jun 2026 11:59:39 +0900 Subject: [PATCH] Reduce Memory Copy When Frame Capture Success --- Core/RenderManager.cs | 12 +----------- Util/FFmpeg/FFmpegProcess.cs | 7 +++++++ Util/StreamUtil.cs | 24 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 Util/StreamUtil.cs diff --git a/Core/RenderManager.cs b/Core/RenderManager.cs index a163986..9bdf07c 100644 --- a/Core/RenderManager.cs +++ b/Core/RenderManager.cs @@ -463,17 +463,7 @@ namespace ADOFAIRenderer.Core } else if (frame.NativePointer != IntPtr.Zero && frame.Length > 0) { - var buffer = FFmpegProcess.RentRawBytes(frame.Length); - unsafe - { - fixed (byte* destPtr = buffer) - { - Buffer.MemoryCopy((void*)frame.NativePointer, destPtr, buffer.Length, frame.Length); - } - } - - videoFFmpeg.SendDataFromBuffer(buffer, frame.Length); - ArrayPool.Shared.Return(buffer); + videoFFmpeg.SendDataFromNativeBuffer(frame.NativePointer, frame.Length); if (frame.ReadbackState != null) { diff --git a/Util/FFmpeg/FFmpegProcess.cs b/Util/FFmpeg/FFmpegProcess.cs index 5424d45..68c0293 100644 --- a/Util/FFmpeg/FFmpegProcess.cs +++ b/Util/FFmpeg/FFmpegProcess.cs @@ -44,6 +44,13 @@ namespace ADOFAIRenderer.Util.FFmpeg _inputStream.Flush(); } + public void SendDataFromNativeBuffer(IntPtr nativePtr, int length) + { + if (_inputStream == null) return; + StreamUtil.WriteNativePtrToStream(nativePtr, length, _inputStream); + _inputStream.Flush(); + } + public void Close() { if (_ffmpegProcess == null || _ffmpegProcess.HasExited || _inputStream == null) return; diff --git a/Util/StreamUtil.cs b/Util/StreamUtil.cs new file mode 100644 index 0000000..8d73c04 --- /dev/null +++ b/Util/StreamUtil.cs @@ -0,0 +1,24 @@ +using System; +using System.IO; + +namespace ADOFAIRenderer.Util +{ + public static class StreamUtil + { + public static void WriteNativePtrToStream(IntPtr nativePtr, int length, Stream destinationStream) + { + if (nativePtr == IntPtr.Zero) + throw new ArgumentNullException(nameof(nativePtr)); + if (length <= 0) return; + + unsafe + { + // Create an unmanaged memory stream that wraps the native pointer + // (This does not allocate new memory; it references the existing pointer) + using var unmanagedStream = new UnmanagedMemoryStream((byte*)nativePtr, length); + // Copy the data directly into your target stream + unmanagedStream.CopyTo(destinationStream); + } + } + } +} \ No newline at end of file