summaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp61
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;
}