#include #include #include "utils/config.hpp" #include "utils/globals.hpp" #include "core/game.hpp" #include "entities/world.hpp" #include "entities/player.hpp" #include "utils/frame_profiler.hpp" int main() { FRAME_SORT_PEAK; if (!SDL_Init(SDL_INIT_VIDEO)) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_Init failed: %s", SDL_GetError()); return 1; } Nimbin::Game game; if (!game.init()) { SDL_Quit(); return 1; } // Without this clamp an OS pause ruins the next physics substep // AND poisons profiler readings. constexpr Uint64 MAX_DT_NS = 100'000'000ull; // 100 ms bool running = true; Uint64 past = SDL_GetTicksNS(); while (running) { FRAME_BEGIN(); { FP_ZONE("main.events"); SDL_Event event; while (SDL_PollEvent(&event)) { if (event.type == SDL_EVENT_QUIT) running = false; else game.handle_Event(event); } } Uint64 now = SDL_GetTicksNS(); Uint64 dt_ns = now - past; past = now; if (dt_ns > MAX_DT_NS) dt_ns = MAX_DT_NS; { FP_ZONE("main.update"); game.update(static_cast(dt_ns)); } { FP_ZONE("main.render"); game.render(); } FRAME_END(); } game.shutdown(); SDL_Quit(); return 0; }