58 lines
1.5 KiB
C++
58 lines
1.5 KiB
C++
#include <Core.hpp>
|
|
#include <EmuThread.hpp>
|
|
#include <KaizenGui.hpp>
|
|
|
|
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<double>(endFrameTime - startFrameTime) / 1ms;
|
|
avgFps += frameTimeMs;
|
|
|
|
sampledFps++;
|
|
|
|
if (const auto elapsedSinceLastSample = std::chrono::duration<double>(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 = {};
|
|
}
|