Refactoring, add some buffering to improve performance.

This commit is contained in:
Christian Speckner 2017-02-06 22:43:35 +01:00
parent cef5fb4da0
commit 00bfd088d3
2 changed files with 78 additions and 24 deletions

View File

@ -47,16 +47,22 @@ void Player::reset()
myColor = myObjectColor = myDebugColor = 0; myColor = myObjectColor = myDebugColor = 0;
myDebugEnabled = false; myDebugEnabled = false;
collision = myCollisionMaskDisabled; collision = myCollisionMaskDisabled;
myDivider = 1;
mySampleCounter = 0; mySampleCounter = 0;
myDividerPending = 0; myDividerPending = 0;
myDividerChangeCounter = -1; myDividerChangeCounter = -1;
setDivider(1);
updatePattern();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Player::grp(uInt8 pattern) void Player::grp(uInt8 pattern)
{ {
const uInt8 oldPatternNew = myPatternNew;
myPatternNew = pattern; myPatternNew = pattern;
if (!myIsDelaying && myPatternNew != oldPatternNew) updatePattern();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -97,7 +103,7 @@ void Player::nusiz(uInt8 value)
case 0x12: case 0x12:
case 0x14: case 0x14:
if ((myRenderCounter - Count::renderCounterOffset) < 3) if ((myRenderCounter - Count::renderCounterOffset) < 3)
myDivider = myDividerPending; setDivider(myDividerPending);
else else
myDividerChangeCounter = 1; myDividerChangeCounter = 1;
break; break;
@ -105,9 +111,9 @@ void Player::nusiz(uInt8 value)
case 0x21: case 0x21:
case 0x41: case 0x41:
if ((myRenderCounter - Count::renderCounterOffset) < 3) { if ((myRenderCounter - Count::renderCounterOffset) < 3) {
myDivider = myDividerPending; setDivider(myDividerPending);
} else if ((myRenderCounter - Count::renderCounterOffset) < 5) { } else if ((myRenderCounter - Count::renderCounterOffset) < 5) {
myDivider = myDividerPending; setDivider(myDividerPending);
myRenderCounter--; myRenderCounter--;
} else { } else {
myDividerChangeCounter = 1; myDividerChangeCounter = 1;
@ -118,19 +124,19 @@ void Player::nusiz(uInt8 value)
case 0x42: case 0x42:
case 0x24: case 0x24:
if (myRenderCounter < 1) if (myRenderCounter < 1)
myDivider = myDividerPending; setDivider(myDividerPending);
else else
myDividerChangeCounter = (myDivider - (myRenderCounter - 1) % myDivider); myDividerChangeCounter = (myDivider - (myRenderCounter - 1) % myDivider);
break; break;
default: default:
// should never happen // should never happen
myDivider = myDividerPending; setDivider(myDividerPending);
break; break;
} }
} else { } else {
myDivider = myDividerPending; setDivider(myDividerPending);
} }
} }
@ -148,7 +154,11 @@ void Player::resp(uInt8 counter)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Player::refp(uInt8 value) void Player::refp(uInt8 value)
{ {
const bool oldIsReflected = myIsReflected;
myIsReflected = (value & 0x08) > 0; myIsReflected = (value & 0x08) > 0;
if (oldIsReflected != myIsReflected) updatePattern();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -157,12 +167,18 @@ void Player::vdelp(uInt8 value)
const bool oldIsDelaying = myIsDelaying; const bool oldIsDelaying = myIsDelaying;
myIsDelaying = (value & 0x01) > 0; myIsDelaying = (value & 0x01) > 0;
if (oldIsDelaying != myIsDelaying) updatePattern();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Player::toggleEnabled(bool enabled) void Player::toggleEnabled(bool enabled)
{ {
const bool oldIsSuppressed = myIsSuppressed;
myIsSuppressed = !enabled; myIsSuppressed = !enabled;
if (oldIsSuppressed != myIsSuppressed) updatePattern();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -216,16 +232,12 @@ bool Player::movementTick(uInt32 clock, bool apply)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Player::render() void Player::render()
{ {
if (!myIsRendering || myRenderCounter < (myDivider > 1 ? 1 : 0)) { if (!myIsRendering || myRenderCounter < myRenderCounterTripPoint) {
collision = myCollisionMaskDisabled; collision = myCollisionMaskDisabled;
return; return;
} }
uInt8 pixel = collision = (myPattern & (1 << mySampleCounter)) ? myCollisionMaskEnabled : myCollisionMaskDisabled;
(myIsDelaying ? myPatternOld : myPatternNew) &
(1 << (!myIsReflected ? (7 - mySampleCounter) : mySampleCounter));
collision = (pixel > 0) ? myCollisionMaskEnabled : myCollisionMaskDisabled;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -238,19 +250,24 @@ void Player::tick()
} else if (myIsRendering) { } else if (myIsRendering) {
myRenderCounter++; myRenderCounter++;
if (myDivider == 1) { switch (myDivider) {
if (myRenderCounter > 0) { case 1:
mySampleCounter++; if (myRenderCounter > 0)
} mySampleCounter++;
if (myRenderCounter >= 0 && myDividerChangeCounter >= 0 && myDividerChangeCounter-- == 0) if (myRenderCounter >= 0 && myDividerChangeCounter >= 0 && myDividerChangeCounter-- == 0)
myDivider = myDividerPending; setDivider(myDividerPending);
} else {
if (myRenderCounter > 1 && (((myRenderCounter - 1) % myDivider) == 0))
mySampleCounter++;
if (myRenderCounter > 0 && myDividerChangeCounter >= 0 && myDividerChangeCounter-- == 0) break;
myDivider = myDividerPending;
default:
if (myRenderCounter > 1 && (((myRenderCounter - 1) % myDivider) == 0))
mySampleCounter++;
if (myRenderCounter > 0 && myDividerChangeCounter >= 0 && myDividerChangeCounter-- == 0)
setDivider(myDividerPending);
break;
} }
if (mySampleCounter > 7) myIsRendering = false; if (mySampleCounter > 7) myIsRendering = false;
@ -265,6 +282,8 @@ void Player::shufflePatterns()
const uInt8 oldPatternOld = myPatternOld; const uInt8 oldPatternOld = myPatternOld;
myPatternOld = myPatternNew; myPatternOld = myPatternNew;
if (myIsDelaying && myPatternOld != oldPatternOld) updatePattern();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -286,6 +305,37 @@ uInt8 Player::getRespClock() const
} }
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Player::updatePattern()
{
if (myIsSuppressed) {
myPattern = 0;
return;
}
myPattern = myIsDelaying ? myPatternOld : myPatternNew;
if (!myIsReflected) {
myPattern = (
((myPattern & 0x01) << 7) |
((myPattern & 0x02) << 5) |
((myPattern & 0x04) << 3) |
((myPattern & 0x08) << 1) |
((myPattern & 0x10) >> 1) |
((myPattern & 0x20) >> 3) |
((myPattern & 0x40) >> 5) |
((myPattern & 0x80) >> 7)
);
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Player::setDivider(uInt8 divider)
{
myDivider = divider;
myRenderCounterTripPoint = divider == 1 ? 0 : 1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Player::applyColors() void Player::applyColors()
{ {

View File

@ -86,7 +86,9 @@ class Player : public Serializable
private: private:
void updatePattern();
void applyColors(); void applyColors();
void setDivider(uInt8 divider);
private: private:
@ -104,6 +106,7 @@ class Player : public Serializable
bool myIsRendering; bool myIsRendering;
Int8 myRenderCounter; Int8 myRenderCounter;
Int8 myRenderCounterTripPoint;
uInt8 myDivider; uInt8 myDivider;
uInt8 myDividerPending; uInt8 myDividerPending;
uInt8 mySampleCounter; uInt8 mySampleCounter;
@ -113,6 +116,7 @@ class Player : public Serializable
uInt8 myPatternOld; uInt8 myPatternOld;
uInt8 myPatternNew; uInt8 myPatternNew;
uInt8 myPattern;
bool myIsReflected; bool myIsReflected;
bool myIsDelaying; bool myIsDelaying;