fix: render timer — no hang, spiral-of-death prevention
- renderTimer accumulates deltaTime each tick - Render only when renderTimer >= 16.67ms - If timer overshoots (slow frame), clamp to 0 to prevent spiral of death - No Thread.Sleep/continue — loop runs continuously, just skips render when not enough time has passed
This commit is contained in:
@@ -81,12 +81,12 @@ class Program
|
|||||||
|
|
||||||
const double renderFps = 60.0;
|
const double renderFps = 60.0;
|
||||||
var renderFrameTime = 1.0 / renderFps;
|
var renderFrameTime = 1.0 / renderFps;
|
||||||
var renderAccumulator = 0.0;
|
var renderTimer = 0.0;
|
||||||
|
|
||||||
while (!window.ShouldClose)
|
while (!window.ShouldClose)
|
||||||
{
|
{
|
||||||
timing.Tick();
|
timing.Tick();
|
||||||
renderAccumulator += timing.DeltaTime;
|
renderTimer += timing.DeltaTime;
|
||||||
|
|
||||||
// Physics + input run at full speed (uncapped)
|
// Physics + input run at full speed (uncapped)
|
||||||
window.PumpEvents();
|
window.PumpEvents();
|
||||||
@@ -389,9 +389,11 @@ class Program
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fixed render rate: 60 FPS
|
// Fixed render rate: 60 FPS
|
||||||
renderAccumulator -= renderFrameTime;
|
if (renderTimer >= renderFrameTime)
|
||||||
if (renderAccumulator >= 0)
|
|
||||||
{
|
{
|
||||||
|
renderTimer -= renderFrameTime;
|
||||||
|
if (renderTimer > renderFrameTime) renderTimer = 0; // prevent spiral of death
|
||||||
|
|
||||||
// Set recording flag before render so renderer can capture
|
// Set recording flag before render so renderer can capture
|
||||||
vkRenderer!.IsRecording = isRecording;
|
vkRenderer!.IsRecording = isRecording;
|
||||||
|
|
||||||
@@ -420,12 +422,6 @@ class Program
|
|||||||
|
|
||||||
frames++;
|
frames++;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// Not enough time for a render frame — sleep briefly
|
|
||||||
Thread.Sleep(1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (timing.TotalTime - lastFpsTime >= 1.0)
|
if (timing.TotalTime - lastFpsTime >= 1.0)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"FPS: {frames}, Delta: {timing.DeltaTime * 1000.0:F2} ms");
|
Console.WriteLine($"FPS: {frames}, Delta: {timing.DeltaTime * 1000.0:F2} ms");
|
||||||
|
|||||||
Reference in New Issue
Block a user