SHA256
Implement Filter-Before-Capture Structure
This commit is contained in:
1 parent
379c0360d7
commit
ec06f99603
4 files changed
+70
-38
No files matched your search
@@ -15,7 +15,7 @@ namespace ADOFAIRenderer.Util.FFmpeg
|
||||
|
||||
public bool IsEnd => _ffmpegProcess is { HasExited: true };
|
||||
|
||||
public void Execute(string command)
|
||||
protected void Execute(string command)
|
||||
{
|
||||
if (string.IsNullOrEmpty(command))
|
||||
{
|
||||
@@ -39,7 +39,7 @@ namespace ADOFAIRenderer.Util.FFmpeg
|
||||
public void SendDataFromBuffer(byte[] buffer, int length = -1)
|
||||
{
|
||||
if (_inputStream == null) return;
|
||||
int writeLength = length < 0 ? buffer.Length : length;
|
||||
var writeLength = length < 0 ? buffer.Length : length;
|
||||
_inputStream.Write(buffer, 0, writeLength);
|
||||
_inputStream.Flush();
|
||||
}
|
||||
|
||||
+27
-11
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections.Generic;
|
||||
using ADOFAIRenderer.Component;
|
||||
using ADOFAIRenderer.Util.FFmpeg;
|
||||
@@ -17,6 +18,7 @@ namespace ADOFAIRenderer.Util
|
||||
private readonly Stack<ReadbackRequestState> _statePool = new Stack<ReadbackRequestState>();
|
||||
private readonly object _poolLock = new object();
|
||||
private bool _isInitialized;
|
||||
private volatile bool _isDisposed;
|
||||
|
||||
public FrameReader()
|
||||
{
|
||||
@@ -63,7 +65,16 @@ namespace ADOFAIRenderer.Util
|
||||
{
|
||||
var frame = state.FrameIndex;
|
||||
|
||||
if (RenderManager.IsRenderCancelled)
|
||||
lock (_poolLock)
|
||||
{
|
||||
if (_isDisposed)
|
||||
{
|
||||
state.Dispose();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (RenderMod.IsRenderCancelled)
|
||||
{
|
||||
RecycleState(state);
|
||||
return;
|
||||
@@ -72,9 +83,12 @@ namespace ADOFAIRenderer.Util
|
||||
if (request.hasError)
|
||||
{
|
||||
RenderMod.ReadbackFailureCount++;
|
||||
Melon<RenderMod>.Logger.Warning($"[OOM Prevent] GPU Readback failed for frame {frame}. Queue deadlock prevented by sending an empty frame.");
|
||||
Melon<RenderMod>.Logger.Warning($"[OOM Prevent] GPU Readback failed for frame {frame}. Queue deadlock prevented by sending a black frame.");
|
||||
|
||||
PushToQueue(frame, Array.Empty<byte>());
|
||||
var byteSize = state.NativeBuffer.Length;
|
||||
var blackFrame = ArrayPool<byte>.Shared.Rent(byteSize);
|
||||
Array.Clear(blackFrame, 0, byteSize);
|
||||
PushToQueue(frame, blackFrame);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -97,15 +111,15 @@ namespace ADOFAIRenderer.Util
|
||||
|
||||
private void RecycleState(ReadbackRequestState state)
|
||||
{
|
||||
if (!_isInitialized)
|
||||
{
|
||||
state.Dispose();
|
||||
return;
|
||||
}
|
||||
|
||||
state.Recycle();
|
||||
lock (_poolLock)
|
||||
{
|
||||
if (_isDisposed || !_isInitialized)
|
||||
{
|
||||
state.Dispose();
|
||||
return;
|
||||
}
|
||||
|
||||
state.Recycle();
|
||||
_statePool.Push(state);
|
||||
}
|
||||
}
|
||||
@@ -122,6 +136,8 @@ namespace ADOFAIRenderer.Util
|
||||
{
|
||||
lock (_poolLock)
|
||||
{
|
||||
if (_isDisposed) return;
|
||||
_isDisposed = true;
|
||||
while (_statePool.Count > 0)
|
||||
{
|
||||
var state = _statePool.Pop();
|
||||
|
||||
Reference in new issue
Block a user