Пара предложений (при условии, что вы можете сделать моментальный снимок в любой момент, и вы сохраняете дельты вперед).
1 .. Если воспроизведение короткое, а состояние не слишком большое,фактически генерировать снимки для каждого кадра в последовательности и «рендерить» их в обратном порядке.
2 .. Если все состояние очень большое, генерировать снимок только для последнего кадра обратного воспроизведения.Затем примените X вперед дельты к снимку, чтобы создать первый кадр обратного воспроизведения.Визуализируйте это.Затем примените дельты X-1 и визуализируйте их, повторяя до X = 0, когда вы находитесь в конце воспроизведения (только первый снимок).
// pseudo code for reverse play
first, last = GetReplayRange();
if (playReversed) {
GameState snapShot = GenerateSnapshot(first);
GameState currentState;
currentFrame = last;
while (currentFrame != first) {
// loop from snapshot up to current frame
for (i = first; i < currentFrame; i++) {
currentState = snapShot.AddDetlasTo(currentFrame);
}
Render(currentState);
currentFrame--;
}
}
3 .. Если это слишком медленночтобы применить X-обновления к снимкам для «перемотки», а затем сделать серию снимков с N-кадровым интервалом и выполнить тот же обратный трюк в # 2 в более узком диапазоне.
Помните, что даже если у вас естьполностью измененное игровое состояние готово к рендерингу - вам все равно придется рендерить все свои эффекты в обратном порядке, что большинство систем эффектов, вероятно, не приспособлено.