From 9555de60ef105370a508843363dd0a79f15755a3 Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Fri, 19 Jun 2026 09:29:45 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20render=20timer=20=E2=80=94=20no=20hang,?= =?UTF-8?q?=20spiral-of-death=20prevention?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- src/CortexEngine.App/Program.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/CortexEngine.App/Program.cs b/src/CortexEngine.App/Program.cs index 3548e71..f080728 100644 --- a/src/CortexEngine.App/Program.cs +++ b/src/CortexEngine.App/Program.cs @@ -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");