diff options
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/src/main.cpp b/src/main.cpp index bd9dee0..fcddf80 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,7 +16,7 @@ #include "window.hpp" void signal_handler(int signal_num) { - printf("Received signal: %d - shutting down\n", signal_num); + fprintf(stdout, "Received signal: %d - shutting down\n", signal_num); pkeSettings.isGameRunning = false; } @@ -29,7 +29,7 @@ void Tick(double delta) { int main() { signal(SIGTERM, signal_handler); - printf("PKE ENTERING\n"); + fprintf(stdout, "PKE ENTERING\n"); try { AM_Init(); Game_Init(); @@ -49,8 +49,10 @@ int main() { glfwPollEvents(); + int64_t nsAheadHolder = 0.0; if (nsAhead > 0) { - std::this_thread::sleep_until(lastTimePoint + GameTimeDuration(nsAhead + 1)); + nsAheadHolder = nsAhead; + std::this_thread::sleep_for(GameTimeDuration(nsAhead)); nsAhead = 0; } if (vidMode.refreshRate != pkeSettings.targetFPS) { @@ -59,23 +61,23 @@ int main() { } GameTimePoint currentTimePoint = pkeSettings.steadyClock.now(); - double deltaThisTick = (currentTimePoint - lastTimePoint).count() / NANO_DENOM_DOUBLE; + double deltaThisTick = ((currentTimePoint - lastTimePoint).count() - nsAheadHolder) / NANO_DENOM_DOUBLE; deltaThisTick = std::min(deltaThisTick, pkeSettings.minimumDeltaPerFrame); - deltaTillNextRender -= deltaThisTick; - bool shouldRender = deltaTillNextRender < deltaThisTick; lastTimePoint = currentTimePoint; - if (shouldRender) { - if (deltaTillNextRender > 0.0 && deltaThisTick < pkeSettings.deltaPerFrame) { - /* - * We are ahead of schedule && the current tick is faster than our target FPS. - * Simulate the extra time we are ahead and prepare to sleep the difference - * before the next tick. - */ - nsAhead = std::ceil(deltaTillNextRender * NANO_DENOM_DOUBLE); - deltaThisTick += deltaTillNextRender; - } - deltaTillNextRender += pkeSettings.deltaPerFrame; + deltaTillNextRender -= deltaThisTick; + bool shouldRender = pkeSettings.graphicsSettings.isFramerateUnlocked || deltaTillNextRender <= 0.0; + + if (deltaTillNextRender > 0.0 && deltaTillNextRender - deltaThisTick <= 0.0) { + /* + * We are ahead of the render schedule + * && the current tick's speed would put us behind schedule next tick. + * Simulate the extra time we are ahead and prepare to sleep the difference + * before the next tick. + */ + nsAhead = std::ceil(deltaTillNextRender * NANO_DENOM_DOUBLE); + deltaThisTick += deltaTillNextRender; + shouldRender = true; } tickCount += 1; @@ -83,11 +85,22 @@ int main() { if (shouldRender) { Render(); + double msBehind = deltaTillNextRender * -1000; + int64_t behindCount = 0; + while (deltaTillNextRender < pkeSettings.deltaPerFrame) { + behindCount += 1; + deltaTillNextRender += pkeSettings.deltaPerFrame; + } + if (behindCount > 2) { + fprintf(stderr, "[PKE::main] late render - simulated ahead: %fms - delta behind: %fms - missed frames:%ld\n", nsAheadHolder / (NANO_DENOM_DOUBLE / 1000), msBehind, behindCount - 1); + fflush(stderr); + } } - if (shouldRender == false && (currentTimePoint - lastLogTimePoint).count() > std::chrono::nanoseconds::period::den) { + if ((currentTimePoint - lastLogTimePoint).count() > std::chrono::nanoseconds::period::den) { lastLogTimePoint = currentTimePoint; - printf("TPS: ~%ld - actual:%ld\n", int64_t(1 / deltaThisTick), tickCount); + fprintf(stdout, "TPS: ~%ld - actual:%ld\n", int64_t(1 / deltaThisTick), tickCount); + fflush(stdout); tickCount = 0; } @@ -97,13 +110,13 @@ int main() { vkDeviceWaitIdle(vkDevice); } catch (const std::exception &exc) { - printf("EXCEPTION: %s\n", exc.what()); + fprintf(stdout, "EXCEPTION: %s\n", exc.what()); } catch (const char *err) { - printf("UNHANDLED EXCEPTION: %s\n", err); + fprintf(stdout, "UNHANDLED EXCEPTION: %s\n", err); } catch (...) { - printf("UNHANDLED EXCEPTION\n"); + fprintf(stdout, "UNHANDLED EXCEPTION\n"); } - printf("PKE SHUTDOWN INITIATED\n"); + fprintf(stdout, "PKE SHUTDOWN INITIATED\n"); Game_Teardown(); Event_Teardown(); EntityType_Teardown(); @@ -112,6 +125,6 @@ int main() { AM_Teardown(); DestroyWindow(); Pke_DebugPrint(); - printf("PKE EXITING\n"); + fprintf(stdout, "PKE EXITING\n"); return 0; } |
