After rename, before performance testing.

master
Zed A. Shaw 15 hours ago
parent 59c93529e8
commit 407cc58f1f
  1. 4
      Makefile
  2. 5
      meson.build
  3. BIN
      roms/test_opcode.ch8
  4. 3
      src/chip8.cpp
  5. 23
      src/main.cpp
  6. 11
      src/stats.cpp
  7. 59
      src/stats.hpp

@ -15,13 +15,13 @@ debug_build:
meson compile -j 4 -C builddir
run: build
./builddir/chip8.exe 1 1 ./roms/test_opcode.ch8
./builddir/b8rk.exe 1 1 ./roms/test_opcode.ch8
debug: build
gdb --nx -x .gdbinit --ex run --args builddir/runtests.exe
debug_run: build
gdb --nx -x .gdbinit --batch --ex run --ex bt --ex q --args builddir/chip8.exe 1 1 ./roms/test_opcode.ch8
gdb --nx -x .gdbinit --batch --ex run --ex bt --ex q --args builddir/b8rk.exe 1 1 ./roms/test_opcode.ch8
clean:
meson compile --clean -C builddir

@ -1,4 +1,4 @@
project('chip8', 'cpp',
project('b8rk', 'cpp',
version: '0.1.0',
default_options: [
'cpp_std=c++23',
@ -83,9 +83,10 @@ dependencies += [
sources = [
'src/dbc.cpp',
'src/chip8.cpp',
'src/stats.cpp',
]
executable('chip8',
executable('b8rk',
sources + [ 'src/main.cpp' ],
cpp_args: cpp_args,
link_args: link_args,

Binary file not shown.

@ -106,9 +106,6 @@ void Chip8::Cycle() {
if(soundTimer > 0) {
--soundTimer;
}
fmt::println("opcode: {}, delay: {}, sound: {}, pc: {}",
opcode, delayTimer, soundTimer, pc);
}

@ -10,7 +10,7 @@
#include <SFML/Graphics/RectangleShape.hpp>
#include "dbc.hpp"
#include "chip8.hpp"
#include "stats.hpp"
struct Display {
sf::RenderWindow& window;
@ -92,10 +92,27 @@ int main(int argc, char* argv[]) {
window.setVerticalSyncEnabled(true);
Display display{window, {0, 0}, {1000, 1000}};
Stats cycle_stats;
Stats render_stats;
while (display.active()) {
auto currentTime = std::chrono::high_resolution_clock::now();
float dt = std::chrono::duration<float, std::chrono::milliseconds::period>(currentTime - lastCycleTime).count();
if (dt > cycleDelay)
{
lastCycleTime = currentTime;
auto t = cycle_stats.time_start();
chip8.Cycle();
cycle_stats.sample_time(t);
}
while (true) {
chip8.Cycle();
auto t = render_stats.time_start();
display.update(chip8);
display.render();
render_stats.sample_time(t);
}
cycle_stats.dump("cycle times");
render_stats.dump("render times");
}

@ -0,0 +1,11 @@
#include "stats.hpp"
#include <fmt/core.h>
#include "dbc.hpp"
void Stats::dump(std::string msg)
{
dbc::log($F("{}: sum: {}, sumsq: {}, n: {}, "
"min: {}, max: {}, mean: {}, stddev: {}",
msg, sum, sumsq, n, min, max, mean(),
stddev()));
}

@ -0,0 +1,59 @@
#pragma once
#include <cmath>
#include <chrono>
struct Stats {
using TimeBullshit = std::chrono::time_point<std::chrono::high_resolution_clock>;
double sum = 0.0;
double sumsq = 0.0;
double n = 0.0;
double min = 0.0;
double max = 0.0;
inline void reset() {
sum = 0.0;
sumsq = 0.0;
n = 0.0;
min = 0.0;
max = 0.0;
}
inline double mean() {
return sum / n;
}
inline double stddev() {
return std::sqrt((sumsq - (sum * sum / n)) / (n - 1));
}
inline void sample(double s) {
sum += s;
sumsq += s * s;
if (n == 0) {
min = s;
max = s;
} else {
if (min > s) min = s;
if (max < s) max = s;
}
n += 1;
}
inline TimeBullshit time_start() {
return std::chrono::high_resolution_clock::now();
}
inline void sample_time(TimeBullshit start) {
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration<double>(end - start);
if(elapsed.count() > 0.0) {
sample(1.0/elapsed.count());
}
}
void dump(std::string msg="");
};
Loading…
Cancel
Save