#include #include namespace Game { void GameManager::run(std::stop_token stopToken) { using namespace std::chrono_literals; LOG("GameManager thread started"); Object::Camera::getInstance().setPosition(0.f, 0.f); // Start with camera at (0, 0) mLastUpdate = clock::now(); // Get the update while (!stopToken.stop_requested()) { clock::time_point now = clock::now(); std::chrono::duration elapsedDt = now - mLastUpdate; float seconds = elapsedDt.count(); const int updatesPerSecond = std::max(1, mTargetUpdatesPerSecond); const auto frameDuration = std::chrono::duration(1.0 / static_cast(updatesPerSecond)); const auto frameStart = std::chrono::steady_clock::now(); try { auto entities = State::GameState::getInstance().getEntitiesSnapshot(); for (auto* entity : entities) { if (entity) { entity->update(seconds); } } } catch (const std::exception& e) { ERROR("Exception in GameManager thread: " << e.what()); } mLastUpdate = now; const auto elapsed = std::chrono::steady_clock::now() - frameStart; const auto remaining = frameDuration - elapsed; if (remaining > 0s) { std::this_thread::sleep_for(remaining); } } } }