diff --git a/src/chip8.cpp b/src/chip8.cpp index 19ab816..d8e41ba 100644 --- a/src/chip8.cpp +++ b/src/chip8.cpp @@ -288,8 +288,10 @@ void Chip8::OP_Dxyn() { uint8_t yPos = registers[Vy] % VIDEO_HEIGHT; registers[0xF] = 0; + for(size_t row = 0; row < height; ++row) { uint8_t spriteByte = memory[index + row]; + for(size_t col = 0; col < 8; ++col) { uint8_t spritePixel = spriteByte & (0x80u >> col); uint32_t* screenPixel = &video[(yPos + row) * VIDEO_WIDTH + (xPos + col)]; @@ -305,6 +307,9 @@ void Chip8::OP_Dxyn() { } } } + + // don't bother rendering collision tests + needs_render = !registers[0xF]; } void Chip8::OP_Ex9E() { diff --git a/src/chip8.hpp b/src/chip8.hpp index e205961..d5ad3ec 100644 --- a/src/chip8.hpp +++ b/src/chip8.hpp @@ -45,6 +45,7 @@ class Chip8 { 0xF0, 0x80, 0xF0, 0x80, 0xF0, // E 0xF0, 0x80, 0xF0, 0x80, 0x80 // F }; + bool needs_render = true; std::default_random_engine randGen; std::uniform_int_distribution randByte; diff --git a/src/main.cpp b/src/main.cpp index ecdc702..8082bd8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -99,13 +99,15 @@ int main(int argc, char* argv[]) { chip8.Cycle(); cycle_stats.sample_time(t); - auto ut = update_stats.time_start(); - display.update(chip8); - update_stats.sample_time(ut); - - auto rt = render_stats.time_start(); - display.render(); - render_stats.sample_time(rt); + if(chip8.needs_render) { + auto ut = update_stats.time_start(); + display.update(chip8); + update_stats.sample_time(ut); + + auto rt = render_stats.time_start(); + display.render(); + render_stats.sample_time(rt); + } } cycle_stats.dump("CYCLE TIMES");