Программирование игр не имеет ничего общего ни с программированием «корпоративных приложений», ни с «программированием веб-приложений».
Таким образом, это зависит от того, над какой игрой вы работаете, но от вашего подхода и от тех, у кого нет денег, абсолютно не имеет отношение к тому, как игровые состояния сохраняются в «реальных» играх. Производительность будет ужасно плохой, и в итоге вы будете использовать много памяти и дискового пространства.
Великолепные игры, такие как, например, Warcraft III от Blizzard или Age of Empires от Microsoft, когда-либо хранят только пользовательские данные, необходимые для воспроизведения любого игрового состояния .
Вот так они достигают сверхэффективной передачи по сети, даже когда у игроков есть сотни или тысячи объектов, и именно так они достигают крошечных сохраненных игровых файлов (которые можно использовать либо для продолжения игры, либо для воспроизведения): хотите низкую задержку? легко, просто отправьте по UDP нажатия клавиш и щелчков мышью игроков и время, когда эти входы произошли.
Как это связано с отменой / повтором? Trivial ...
Представьте, что с момента запуска игры у вас было 200 пользовательских входов, и вы хотите отменить последний шаг: вы запускаете игру с нуля и набираете 199 первых входных данных. Вот и все. Совершенная отмена.
Конечно, вам нужно только воспроизвести логику при воспроизведении этих 199 шагов, без необходимости обновления вашего представления. Для большинства игр логика - это крошечная часть общего времени, затраченного на просмотр (большая часть времени тратится на просмотр). Поэтому воспроизведение этих входов происходит очень быстро.
Был там, сделал это:)
Теперь, если вы хотите другой способ сделать неограниченную отмену / повтор, тогда нужно кое-что сказать о «OO поверх неизменяемых объектов»: я написал редакторы игровых инструментов (например, редактор карт) с неограниченным отменить / повторить тоже. Хитрость в том, чтобы только когда-либо использовать неизменяемые объекты. Тогда сохранить прежние состояния легко: просто объект на вершине вашей иерархии ('gamemap239').
Поскольку вы когда-либо используете только неизменяемые объекты, «новая» игровая карта разделяет 99,9% своих объектов с предыдущей игровой картой, и, следовательно, использование памяти невероятно низкое, что позволяет сохранять огромное количество состояний.
Я успешно применил это «OO поверх неизменяемых объектов для эффективного отмены / повтора» в коммерческих программах, которые не являются играми, и это действительно удивительная техника.
Теперь все зависит от игры, которую вы делаете: конечно, для игры тральщика вы можете использовать Swing и обычные методы программирования Java. Но для более продвинутых игр обычные Java-коллекции и API-интерфейсы, а также обычные приемы программирования entreprise / webapp / fatclient просто не позволяют этого сделать