SHA256
Remove Useless Render Frame Skip Check
This commit is contained in:
3 files changed
-84
No files matched your search
@@ -15,7 +15,6 @@ using ADOFAIRenderer.Util.FFmpeg;
|
|||||||
using FFmpeg.AutoGen;
|
using FFmpeg.AutoGen;
|
||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
using MelonLoader;
|
using MelonLoader;
|
||||||
using MelonLoader.Utils;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Rendering;
|
using UnityEngine.Rendering;
|
||||||
using Random = UnityEngine.Random;
|
using Random = UnityEngine.Random;
|
||||||
@@ -73,7 +72,6 @@ internal class RenderManager : MonoBehaviour
|
|||||||
public static bool IsCapturingActive => Instance && Instance.IsCapturing;
|
public static bool IsCapturingActive => Instance && Instance.IsCapturing;
|
||||||
|
|
||||||
public const int MaxQueuedFrames = 64;
|
public const int MaxQueuedFrames = 64;
|
||||||
public const int MaxRenderRetry = 64;
|
|
||||||
|
|
||||||
// Statistics
|
// Statistics
|
||||||
public long framesSent;
|
public long framesSent;
|
||||||
@@ -100,8 +98,6 @@ internal class RenderManager : MonoBehaviour
|
|||||||
private AudioSyncCalculator SyncCalculator { get; set; } = null!;
|
private AudioSyncCalculator SyncCalculator { get; set; } = null!;
|
||||||
|
|
||||||
private FrameReader? _frameReader;
|
private FrameReader? _frameReader;
|
||||||
public bool renderCheck = true;
|
|
||||||
public int skipCount;
|
|
||||||
|
|
||||||
public long frameCountForVideo;
|
public long frameCountForVideo;
|
||||||
public long lastVideoFrameIndex = -1;
|
public long lastVideoFrameIndex = -1;
|
||||||
@@ -277,52 +273,6 @@ internal class RenderManager : MonoBehaviour
|
|||||||
public void OnPreUpdate()
|
public void OnPreUpdate()
|
||||||
{
|
{
|
||||||
if (!IsRendering) return;
|
if (!IsRendering) return;
|
||||||
|
|
||||||
// [Retry logic when frame rendering is skipped due to lag (ported from original mod)]
|
|
||||||
if (renderCheck && IsCapturing)
|
|
||||||
{
|
|
||||||
if (skipCount < MaxRenderRetry)
|
|
||||||
{
|
|
||||||
Melon<RenderMod>.Logger.Warning($"[Render Skipped] Frame {frameCount} rendering missed. Retrying... (Attempt {skipCount + 1}/{MaxRenderRetry})");
|
|
||||||
skipCount++;
|
|
||||||
Time.timeScale = 0f; // Pause progress time (retry)
|
|
||||||
return; // Wait without advancing update
|
|
||||||
}
|
|
||||||
|
|
||||||
// If retries exceed limit, supply a fallback black frame to prevent freezing the pipeline
|
|
||||||
Melon<RenderMod>.Logger.Error($"[Render Skipped] Frame {frameCount} rendering failed after 60 retries. Supplying black frame.");
|
|
||||||
|
|
||||||
var currentFrame = frameCountForVideo++;
|
|
||||||
var renderFPS = Configuration.RenderFPS;
|
|
||||||
var videoFPS = Configuration.VideoFPS;
|
|
||||||
var effectiveVideoFps = Math.Min(videoFPS, renderFPS);
|
|
||||||
var videoFrameIndex = (long)(currentFrame * effectiveVideoFps / renderFPS);
|
|
||||||
|
|
||||||
if (videoFrameIndex > lastVideoFrameIndex)
|
|
||||||
{
|
|
||||||
lastVideoFrameIndex = videoFrameIndex;
|
|
||||||
lastRequestedVideoFrameIndex = videoFrameIndex;
|
|
||||||
|
|
||||||
var byteSize = Configuration.RenderWidth * Configuration.RenderHeight * 4;
|
|
||||||
var blackFrame = ArrayPool<byte>.Shared.Rent(byteSize);
|
|
||||||
Array.Clear(blackFrame, 0, byteSize);
|
|
||||||
|
|
||||||
lock (ImageQueue)
|
|
||||||
{
|
|
||||||
ImageQueue[videoFrameIndex] = new CapturedFrame
|
|
||||||
{
|
|
||||||
ManagedBuffer = blackFrame,
|
|
||||||
Length = byteSize
|
|
||||||
};
|
|
||||||
}
|
|
||||||
FrameAvailableEvent.Set();
|
|
||||||
}
|
|
||||||
|
|
||||||
renderCheck = false; // Allow progress
|
|
||||||
}
|
|
||||||
|
|
||||||
skipCount = 0;
|
|
||||||
renderCheck = true; // Reset for next frame check
|
|
||||||
frameCount++;
|
frameCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -344,8 +294,6 @@ internal class RenderManager : MonoBehaviour
|
|||||||
{
|
{
|
||||||
if (!IsCapturing || !texture) return;
|
if (!IsCapturing || !texture) return;
|
||||||
|
|
||||||
renderCheck = false; // Normal rendering complete for this frame
|
|
||||||
|
|
||||||
// [Backpressure Throttling]
|
// [Backpressure Throttling]
|
||||||
isThrottling = false;
|
isThrottling = false;
|
||||||
|
|
||||||
@@ -511,8 +459,6 @@ internal class RenderManager : MonoBehaviour
|
|||||||
frameCountForVideo = 0;
|
frameCountForVideo = 0;
|
||||||
lastVideoFrameIndex = -1;
|
lastVideoFrameIndex = -1;
|
||||||
lastRequestedVideoFrameIndex = -1;
|
lastRequestedVideoFrameIndex = -1;
|
||||||
renderCheck = true;
|
|
||||||
skipCount = 0;
|
|
||||||
endRequested = false;
|
endRequested = false;
|
||||||
endSuccessful = false;
|
endSuccessful = false;
|
||||||
FrameAvailableEvent.Reset();
|
FrameAvailableEvent.Reset();
|
||||||
|
|||||||
@@ -205,7 +205,6 @@ internal class DebugMonitorUI : MonoBehaviour
|
|||||||
sb.AppendLine();
|
sb.AppendLine();
|
||||||
sb.AppendLine($"• Throttling Controls: {(RenderManager.Instance ? RenderManager.Instance.throttleCount : 0)} times");
|
sb.AppendLine($"• Throttling Controls: {(RenderManager.Instance ? RenderManager.Instance.throttleCount : 0)} times");
|
||||||
sb.AppendLine($"• Readback Hard Failures: <color=#ff3333>{(RenderManager.Instance ? RenderManager.Instance.readbackFailureCount : 0)}</color> times");
|
sb.AppendLine($"• Readback Hard Failures: <color=#ff3333>{(RenderManager.Instance ? RenderManager.Instance.readbackFailureCount : 0)}</color> times");
|
||||||
sb.AppendLine($"• Render Skip-Retry: {(RenderManager.Instance ? RenderManager.Instance.skipCount : 0)} / {RenderManager.MaxRenderRetry}");
|
|
||||||
|
|
||||||
var memoryMb = GC.GetTotalMemory(false) / (1024.0 * 1024.0);
|
var memoryMb = GC.GetTotalMemory(false) / (1024.0 * 1024.0);
|
||||||
sb.AppendLine($"• Mono Heap Memory: {memoryMb:F2} MB");
|
sb.AppendLine($"• Mono Heap Memory: {memoryMb:F2} MB");
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using MelonLoader;
|
|
||||||
|
|
||||||
namespace ADOFAIRenderer.Util
|
|
||||||
{
|
|
||||||
internal 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
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var span = new ReadOnlySpan<byte>((void*)nativePtr, length);
|
|
||||||
destinationStream.Write(span);
|
|
||||||
}
|
|
||||||
catch (IOException err)
|
|
||||||
{
|
|
||||||
Melon<RenderMod>.Logger.Error($"FFmpeg pipe closed unexpectedly: {err.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in new issue
Block a user