#include #include #include EmuThread::EmuThread(double &fps, RenderWidget &renderWidget, SettingsWindow &settings) noexcept : renderWidget(renderWidget), settings(settings), fps(fps) {} void EmuThread::run() const noexcept { n64::Core& core = n64::Core::GetInstance(); if(!core.romLoaded) return; auto lastSample = std::chrono::high_resolution_clock::now(); auto avgFps = 16.667; auto sampledFps = 0; static bool oneSecondPassed = false; fps = 1000.0 / avgFps; const auto startFrameTime = std::chrono::high_resolution_clock::now(); if (!core.pause) { core.Run(settings.getVolumeL(), settings.getVolumeR()); } const auto endFrameTime = std::chrono::high_resolution_clock::now(); using namespace std::chrono_literals; const auto frameTimeMs = std::chrono::duration(endFrameTime - startFrameTime) / 1ms; avgFps += frameTimeMs; sampledFps++; if (const auto elapsedSinceLastSample = std::chrono::duration(endFrameTime - lastSample) / 1s; elapsedSinceLastSample >= 1.0) { if (!oneSecondPassed) { oneSecondPassed = true; return; } avgFps /= sampledFps; fps = 1000.0 / avgFps; } } void EmuThread::TogglePause() const noexcept { n64::Core::GetInstance().TogglePause(); } void EmuThread::Reset() const noexcept { n64::Core& core = n64::Core::GetInstance(); core.Stop(); core.LoadROM(core.rom); } void EmuThread::Stop() const noexcept { n64::Core& core = n64::Core::GetInstance(); core.Stop(); core.rom = {}; }