SHA256
forked from ADOFAIEditorForum/ADOFAIRenderer
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 HarmonyLib;
|
||||
using MelonLoader;
|
||||
using MelonLoader.Utils;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using Random = UnityEngine.Random;
|
||||
@@ -73,7 +72,6 @@ internal class RenderManager : MonoBehaviour
|
||||
public static bool IsCapturingActive => Instance && Instance.IsCapturing;
|
||||
|
||||
public const int MaxQueuedFrames = 64;
|
||||
public const int MaxRenderRetry = 64;
|
||||
|
||||
// Statistics
|
||||
public long framesSent;
|
||||
@@ -100,8 +98,6 @@ internal class RenderManager : MonoBehaviour
|
||||
private AudioSyncCalculator SyncCalculator { get; set; } = null!;
|
||||
|
||||
private FrameReader? _frameReader;
|
||||
public bool renderCheck = true;
|
||||
public int skipCount;
|
||||
|
||||
public long frameCountForVideo;
|
||||
public long lastVideoFrameIndex = -1;
|
||||
@@ -277,52 +273,6 @@ internal class RenderManager : MonoBehaviour
|
||||
public void OnPreUpdate()
|
||||
{
|
||||
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++;
|
||||
}
|
||||
|
||||
@@ -344,8 +294,6 @@ internal class RenderManager : MonoBehaviour
|
||||
{
|
||||
if (!IsCapturing || !texture) return;
|
||||
|
||||
renderCheck = false; // Normal rendering complete for this frame
|
||||
|
||||
// [Backpressure Throttling]
|
||||
isThrottling = false;
|
||||
|
||||
@@ -511,8 +459,6 @@ internal class RenderManager : MonoBehaviour
|
||||
frameCountForVideo = 0;
|
||||
lastVideoFrameIndex = -1;
|
||||
lastRequestedVideoFrameIndex = -1;
|
||||
renderCheck = true;
|
||||
skipCount = 0;
|
||||
endRequested = false;
|
||||
endSuccessful = false;
|
||||
FrameAvailableEvent.Reset();
|
||||
|
||||
@@ -205,7 +205,6 @@ internal class DebugMonitorUI : MonoBehaviour
|
||||
sb.AppendLine();
|
||||
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($"• Render Skip-Retry: {(RenderManager.Instance ? RenderManager.Instance.skipCount : 0)} / {RenderManager.MaxRenderRetry}");
|
||||
|
||||
var memoryMb = GC.GetTotalMemory(false) / (1024.0 * 1024.0);
|
||||
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