java - 撤消/重做功能 Java 的对象序列化

标签 java serialization stack undo

我一直在尝试在我用 Java 编写的游戏中实现和撤消/重做系统。我正在采取在每次移动后序列化游戏状态的方法。我有办法将序列化对象保存在堆栈上并访问它们以进行撤消/重做吗?

最佳答案

游戏编程与“企业应用程序”编程或“网络应用程序编程”没有太大关系。

因此,这取决于您正在开发的游戏类型,但您的方法和给出的方法与“真实”游戏中游戏状态的保存方式绝对无关。性能会非常糟糕,您最终会使用很多内存和磁盘空间。

例如,暴雪的魔兽争霸 III 或微软的帝国时代 等伟大的游戏只会存储重现任何游戏状态所需的用户输入.

这就是他们如何实现超高效的网络传输,即使玩家有成百上千个对象,这就是他们如何实现微小的游戏存档文件(可用于继续游戏或重播):想要低延迟?很简单,只需通过 UDP 发送玩家的击键和鼠标点击以及这些输入发生的时间。

这与撤消/重做有什么关系?琐碎的...

假设自游戏开始以来您已经有 200 次用户输入并且想要撤消最后一步:您从头开始游戏并提供 199 次输入。就是这样。完美撤消。

当然你只需要在回放那199步的时候回放逻辑,不需要更新需要更新你的 View 。对于大多数游戏来说,逻辑只占总时间的一小部分(大部分时间花在 View 上)。因此重放这些输入非常快。

去过那里,做过:)

现在,如果您想要另一种方式来进行无限制的撤消/重做,那么就必须对“OO over immutable objects”说点什么:我编写的游戏工具编辑器(如 map 编辑器)具有以下特点无限制的撤消/重做。诀窍是使用不可变对象(immutable对象)。然后保持以前的状态很容易:只是层次结构顶部的对象('gamemap239')。

因为您只使用不可变对象(immutable对象),"new"游戏 map 与以前的游戏 map 共享其 99.9% 的对象,因此内存使用率低得离谱,可以保留大量状态。

我已经在非游戏的商业软件中成功地应用了这种“面向不可变对象(immutable对象)的 OO 以实现高效的撤消/重做”,这确实是一项了不起的技术。

现在这取决于您正在做的游戏:当然,对于扫雷游戏,您可以使用 Swing 和常规 Java 编程技术。但对于更高级的游戏,常规的 Java 集合和 API 以及常规的 entreprise/webapp/fatclient 编程技术根本行不通。

关于java - 撤消/重做功能 Java 的对象序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2429548/

相关文章:

Java OOP - 学习数组元素实例,用于模拟人类生活......交配和新生

java - 如何处理 TextView 中使用字符串资源的2个链接点击?

django - 按子字段对嵌套序列化器字段的 DRF 序列化器输出进行排序

c++ - 由于类型不匹配,无法将一个指针分配给另一个指针,或者编译器这样说

java - 查看 IDEA 13 Gradle 依赖

java - MapperBuilder 的 NoClassDefFoundError

java - 替换 Google 协议(protocol)数据缓冲区中的字符串

c# - Unity : Issue with serialization since version 5. 0(父/子关系)

c++ - Infix to Postfix to Output (Postfix Calculator) 使用堆栈

c++ - 使用调用约定 fastcall 的任何实际用例?