From 8f0c3d337fc01bc2a1211e89a0b5a823cbb4dea3 Mon Sep 17 00:00:00 2001 From: wgroeneveld Date: Wed, 18 Dec 2019 21:36:50 +0100 Subject: [PATCH] optimalizing engine for OAM, remove needles pointer dereferences in every update --- engine/src/sprites/sprite.cpp | 1 + test/spritetest.cpp | 35 +++++++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/engine/src/sprites/sprite.cpp b/engine/src/sprites/sprite.cpp index 0b20ac0..9801522 100644 --- a/engine/src/sprites/sprite.cpp +++ b/engine/src/sprites/sprite.cpp @@ -53,6 +53,7 @@ void Sprite::flipVertically(bool flip) { } void Sprite::makeAnimated(int beginFrame, int numberOfFrames, int animationDelay) { + previousFrame = -1; setBeginFrame(beginFrame); animateToFrame(beginFrame); this->numberOfFrames = numberOfFrames; diff --git a/test/spritetest.cpp b/test/spritetest.cpp index ee7f26e..93f927e 100644 --- a/test/spritetest.cpp +++ b/test/spritetest.cpp @@ -182,12 +182,15 @@ const u32 kul_data [] = { class SpriteWithStubOam : public Sprite { public: SpriteWithStubOam(SpriteSize size) : Sprite(nullptr, imageSize, x, y, size) { - oam = std::unique_ptr(new OBJ_ATTR()); } - OBJ_ATTR* buildOamForTesting(int tileIndex = 0) { + OBJ_ATTR getOam() { + return oam; + } + + OBJ_ATTR buildOamForTesting(int tileIndex = 0) { buildOam(tileIndex); - return oam.get(); + return oam; } }; @@ -205,17 +208,33 @@ protected: } }; -TEST_F(SpriteSuite, Sync_Animation_Updates_OAM_To_Next_Frame) { +TEST_F(SpriteSuite, Update_Syncs_Animation_In_OAM_To_Next_Frame) { s = new SpriteWithStubOam(SIZE_16_32); s->makeAnimated(0, 2, 0); auto oam = s->buildOamForTesting(208); // should start at 224 (11100000) after a frame update s->update(); - auto attr2 = std::bitset<16>(oam->attr2).to_string(); + oam = s->getOam(); + auto attr2 = std::bitset<16>(oam.attr2).to_string(); ASSERT_EQ(std::string("0000000011100000"), attr2); } +TEST_F(SpriteSuite, Update_Does_Not_Sync_Animation_In_OAM_If_No_Frames_Changed) { + s = new SpriteWithStubOam(SIZE_16_32); + s->makeAnimated(0, 2, 0); + auto oam = s->buildOamForTesting(208); // should start at 224 (11100000) after a frame update + s->update(); + + s->animateToFrame(2); + s->update(); + + oam = s->getOam(); + auto attr2 = std::bitset<16>(oam.attr2).to_string(); + + ASSERT_EQ(std::string("0000000011010000"), attr2); +} + TEST_F(SpriteSuite, Animated_Sprite_Copy_In_Constructor_Takes_Over_Animation_Properties) { s->makeAnimated(0, 2, 5); @@ -265,10 +284,10 @@ TEST_F(SpriteSuite, CollidesWith_B_Half_In_A_On_X_Axis_Collides) { TEST_F(SpriteSuite, MovesToNegativeCoordsAreMaskedIntoOAM) { s->moveTo(-10, -15); auto oam = s->buildOamForTesting(); - auto attr0 = std::bitset<16>(oam->attr0).to_string(); - auto attr1 = std::bitset<16>(oam->attr1).to_string(); + auto attr0 = std::bitset<16>(oam.attr0).to_string(); + auto attr1 = std::bitset<16>(oam.attr1).to_string(); - ASSERT_EQ(std::string("0000000011110001"), attr0); + ASSERT_EQ(std::string("0010000011110001"), attr0); ASSERT_EQ(std::string("0000000111110110"), attr1); }