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;
|
||||
var renderFrameTime = 1.0 / renderFps;
|
||||
var renderAccumulator = 0.0;
|
||||
var renderTimer = 0.0;
|
||||
|
||||
while (!window.ShouldClose)
|
||||
{
|
||||
timing.Tick();
|
||||
renderAccumulator += timing.DeltaTime;
|
||||
renderTimer += timing.DeltaTime;
|
||||
|
||||
// Physics + input run at full speed (uncapped)
|
||||
window.PumpEvents();
|
||||
@@ -389,9 +389,11 @@ class Program
|
||||
}
|
||||
|
||||
// Fixed render rate: 60 FPS
|
||||
renderAccumulator -= renderFrameTime;
|
||||
if (renderAccumulator >= 0)
|
||||
if (renderTimer >= renderFrameTime)
|
||||
{
|
||||
renderTimer -= renderFrameTime;
|
||||
if (renderTimer > renderFrameTime) renderTimer = 0; // prevent spiral of death
|
||||
|
||||
// Set recording flag before render so renderer can capture
|
||||
vkRenderer!.IsRecording = isRecording;
|
||||
|
||||
@@ -420,12 +422,6 @@ class Program
|
||||
|
||||
frames++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not enough time for a render frame — sleep briefly
|
||||
Thread.Sleep(1);
|
||||
continue;
|
||||
}
|
||||
if (timing.TotalTime - lastFpsTime >= 1.0)
|
||||
{
|
||||
Console.WriteLine($"FPS: {frames}, Delta: {timing.DeltaTime * 1000.0:F2} ms");
|
||||
|
||||
Reference in New Issue
Block a user