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:
emil28092005
2026-06-19 09:29:45 +03:00
parent f2ae4d0f8f
commit 9555de60ef
+6 -10
View File
@@ -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");