removed keeping very 1st state with compression enabled

This commit is contained in:
thrust26 2018-01-29 16:58:26 +01:00
parent b11643881a
commit aa7dd33dc8
3 changed files with 8 additions and 13 deletions

View File

@ -3191,8 +3191,7 @@
going back further in time. To reach the horizon, save states going back further in time. To reach the horizon, save states
will be compressed (*). This means that more and more intermediate will be compressed (*). This means that more and more intermediate
states will be removed and the interval between save states states will be removed and the interval between save states
becomes larger the further they are back in time. The very first becomes larger the further they are back in time.<br>
save state will not be removed.<br>
(*) Compresion only works if 'Uncompressed size' is smaller than (*) Compresion only works if 'Uncompressed size' is smaller than
'Buffer size'. 'Buffer size'.
</td> </td>

View File

@ -56,7 +56,7 @@ void RewindManager::setup()
if(HOR_SETTINGS[i] == myOSystem.settings().getString(prefix + "tm.horizon")) if(HOR_SETTINGS[i] == myOSystem.settings().getString(prefix + "tm.horizon"))
myHorizon = HORIZON_CYCLES[i]; myHorizon = HORIZON_CYCLES[i];
// calc interval growth factor // calc interval growth factor for compression
// this factor defines the backward horizon // this factor defines the backward horizon
const double MAX_FACTOR = 1E8; const double MAX_FACTOR = 1E8;
double minFactor = 0, maxFactor = MAX_FACTOR; double minFactor = 0, maxFactor = MAX_FACTOR;
@ -88,7 +88,6 @@ void RewindManager::setup()
else else
maxFactor = myFactor; maxFactor = myFactor;
} }
//cerr << "factor " << myFactor << endl;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -226,38 +225,32 @@ void RewindManager::compressStates()
double expectedCycles = myInterval * myFactor * (1 + myFactor); double expectedCycles = myInterval * myFactor * (1 + myFactor);
double maxError = 1.5; double maxError = 1.5;
uInt32 idx = myStateList.size() - 2; uInt32 idx = myStateList.size() - 2;
//uInt32 removeIdx = 0;
// in case maxError is <= 1.5 remove first state by default: // in case maxError is <= 1.5 remove first state by default:
Common::LinkedObjectPool<RewindState>::const_iter removeIter = myStateList.first(); Common::LinkedObjectPool<RewindState>::const_iter removeIter = myStateList.first();
if(myUncompressed < mySize) /*if(myUncompressed < mySize)
// if compression is enabled, the first but one state is removed by default: // if compression is enabled, the first but one state is removed by default:
removeIter++; removeIter++;*/
//cerr << "idx: " << idx << endl;
// iterate from last but one to first but one // iterate from last but one to first but one
for(auto it = myStateList.previous(myStateList.last()); it != myStateList.first(); --it) for(auto it = myStateList.previous(myStateList.last()); it != myStateList.first(); --it)
{ {
if(idx < mySize - myUncompressed) if(idx < mySize - myUncompressed)
{ {
//cerr << *it << endl << endl; // debug code
expectedCycles *= myFactor; expectedCycles *= myFactor;
uInt64 prevCycles = myStateList.previous(it)->cycles; uInt64 prevCycles = myStateList.previous(it)->cycles;
uInt64 nextCycles = myStateList.next(it)->cycles; uInt64 nextCycles = myStateList.next(it)->cycles;
double error = expectedCycles / (nextCycles - prevCycles); double error = expectedCycles / (nextCycles - prevCycles);
//cerr << "prevCycles: " << prevCycles << ", nextCycles: " << nextCycles << ", error: " << error << endl;
if(error > maxError) if(error > maxError)
{ {
maxError = error; maxError = error;
removeIter = it; removeIter = it;
//removeIdx = idx;
} }
} }
--idx; --idx;
} }
myStateList.remove(removeIter); // remove myStateList.remove(removeIter); // remove
//cerr << "remove " << removeIdx << endl;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -305,7 +298,7 @@ string RewindManager::getUnitString(Int64 cycles)
{ {
// use the lower unit up to twice the nextCycles unit, except for an exact match of the nextCycles unit // use the lower unit up to twice the nextCycles unit, except for an exact match of the nextCycles unit
// TODO: does the latter make sense, e.g. for ROMs with changing scanlines? // TODO: does the latter make sense, e.g. for ROMs with changing scanlines?
if(cycles < UNIT_CYCLES[i + 1] * 2 && cycles % UNIT_CYCLES[i + 1] != 0) if(cycles == 0 || cycles < UNIT_CYCLES[i + 1] * 2 && cycles % UNIT_CYCLES[i + 1] != 0)
break; break;
} }
result << cycles / UNIT_CYCLES[i] << " " << UNIT_NAMES[i]; result << cycles / UNIT_CYCLES[i] << " " << UNIT_NAMES[i];

View File

@ -38,6 +38,9 @@ class StateManager;
to the end of the list (aka, all future states) are removed, and the internal to the end of the list (aka, all future states) are removed, and the internal
iterator moves to the insertion point of the data (the end of the list). iterator moves to the insertion point of the data (the end of the list).
If the list is full, states are either removed at the beginning (compression
off) or at selective positions (compression on).
@author Stephen Anthony @author Stephen Anthony
*/ */
class RewindManager class RewindManager