algorithm - 将中间系统状态存储为临时文件或字符串? (用于撤消/重做)

标签 algorithm user-interface graphics storage

我有一个图形系统,用户可以在其中绘制/编辑一些基本形状,如直线、贝塞尔曲线等。

在任何情况下,我都有信息,我可以保存这些信息,以便以后按原样重现场景。

为了实现撤消-重做功能,我计划在场景发生变化时保存此信息(如移动/绘制 Action ),然后再重现此信息。

我已经拥有以自定义格式将此信息导出为文件的功能。

我想知道将绘图的中间阶段存储为一系列临时文件是否是个好主意,或者我应该将此信息存储为字符串列表。

这些技术中的一种与其他技术相比有优势/劣势吗?

人们在图形工具方面遵循的总体趋势是什么?

最佳答案

经典方法在四人组的“设计模式”中有所描述。基本上,您将实现一个 Command 类,并将其派生到 MoveCommand、RotateCommand 等中。每个实例都存储执行该命令所需的信息(例如移动元素时的增量和增量)。命令执行后,将其存储在撤消队列中。当用户选择“撤消”时,您会在命令实例上调用另一个原语 undo(),它基本上做相反的事情(所以在我们的例子中它会移动 -deltax 和 -deltay)。这可以为任何命令实现。

虽然这种方法在实践中运行良好并解决了大量问题,但我自己的经验是它也会导致脆弱的撤消/重做队列,因为一旦其中一个命令不能正确处理“撤消” (或根本),没有办法进一步撤消。

您在每一步捕获绘图状态的提议将需要更多内存。作为交换,您根本不需要实现 Command 类来确保一切都可以撤消。

关于algorithm - 将中间系统状态存储为临时文件或字符串? (用于撤消/重做),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31470486/

相关文章:

c - 求一个数的 n 次方根的算法

html - 自定义 HTML 选择创建

reactjs - React、React Native 和 Angular 之间共享相同的风格/外观/设计/用户体验

c# - System.Drawing.dll 中发生类型为 'System.ArgumentException' 的第一次机会异常

graphics - 在PC上编程图形和声音-共有新手问题,其中很多!

c# - 分组连续相同的项目 : IEnumerable<T> to IEnumerable<IEnumerable<T>>

java - Big O 分析中方法调用和返回语句的成本是多少?

algorithm - 多少步才能到达目的地?高效灌水

language-agnostic - 我应该如何称呼包含状态序列的类

android - 通过 Canvas 类硬件绘制在 Android 上加速了吗?