#include "Game.hpp" #include #include #include #include #include "Engine/Utils/Perfs.hpp" #include "Engine/Utils/Timers.hpp" using std::make_shared; using std::make_unique; #define TARGET_FPS (1000/60) std::unique_ptr mPerfsTimer; Game::Game(bool dbg) : gbDbgModeEnabled(dbg) { InitWindows(); if (gbDbgModeEnabled) { gDbgUI = make_unique(); mPerfsTimer = make_unique(); mPerfsTimer->Reset(); } } void Game::InitWindows() { // Create default game window sf::ContextSettings sWindowSettings; sWindowSettings.depthBits = 0; sWindowSettings.stencilBits = 0; sWindowSettings.antialiasingLevel = 8; sWindowSettings.sRgbCapable = true; gMainWindow = make_shared( sf::VideoMode(1080, 720), "ProtoTank", (sf::Style::Close | sf::Style::Titlebar), sWindowSettings ); gMainWindow->setVerticalSyncEnabled(false); gMainWindow->setFramerateLimit(60); gMainWindow->setKeyRepeatEnabled(false); gMainWindow->setMouseCursorVisible(true); } GAME_STATUS Game::Tick(SysTimer& time) { static std::vector msTicksMonitoring; static double mPrevdelta = 0; static int mFrameCnt = 0; double mDelta = time.GetDeltaTime(); if (gDbgUI != nullptr && mPerfsTimer != nullptr) { msTicksMonitoring.push_back((mDelta - mPrevdelta) / TARGET_FPS); if (mPerfsTimer->GetDeltaTime() >= 1000) { // Re-evaluate CPU usage every seconds (for FP'S') double cpuUsage = std::accumulate(msTicksMonitoring.begin(), msTicksMonitoring.end(), 0) / msTicksMonitoring.size(); gDbgUI->UpdateDebugData(cpuUsage, (mDelta - mPrevdelta), mFrameCnt, (PerfsGetVirtMem() / 1000), (PerfsGetPhysMem() / 1000)); mFrameCnt = -1; // Minus one to compensate the direct next frame msTicksMonitoring.clear(); mPerfsTimer->Reset(); } } sf::Event event; while (gMainWindow->pollEvent(event)) { // Wait for next frame (fixed FPS) if (event.type == sf::Event::Closed) gMainWindow->close(); } if (mDelta >= TARGET_FPS) { //TODO: Replace with global var and use dynamic window loader Update(); Render(); mFrameCnt++; time.Reset(); mPrevdelta = -mDelta; } else { mPrevdelta = mDelta; } sf::sleep(sf::milliseconds(TARGET_FPS - (mDelta - mPrevdelta))); if (gMainWindow->isOpen()) return GAME_RUNNING; else return GAME_QUIT; } void Game::Update() { } void Game::Render() { // Clear the draw buffer gMainWindow->clear(); // Draw the arena view //3DRenderer::draw() // Draw the UI above //UI::draw() // Draw the debug informations if enabled if (gDbgUI != nullptr) gDbgUI->DrawDebugData(gMainWindow); // Present the draw buffer gMainWindow->display(); }