使用备忘录/命令模式快速撤消/重做?

2023-11-24

我正在为手机编写一个绘画/图形 Java 应用程序(因此内存有限)。应用程序状态本质上是三个 1000x500 位图(即绘画的图层)。加载三个位图大约需要 2 或 3 秒。

我正在尝试编写一个撤消引擎,但我无法找到一个好的方法来做到这一点。典型的方法是:

  • 使用命令模式:当您撤消时,您会重新加载初始文件的状态,然后播放迄今为止处理的所有命令(最后一个命令除外)。但天真地这样做意味着等待 2 或 3 秒来加载初始状态,这太慢了。也没有足够的内存来存储内存中的初始状态。

  • 使用备忘录模式:当您撤消时,您将用旧状态替换当前状态中已更改的部分。这意味着每个操作都需要将旧状态的位图保存到磁盘,因为移动设备上没有足够的内存来将其存储在内存中。由于保存位图需要时间,如果用户决定例如,我该如何应对?快速连续地绘制许多笔触?我不能让他们等待。

我的所有解决方案都涉及上述模式的复杂混合。

任何人都可以建议一个解决方案,使我能够对我的应用程序进行相当快速的撤消/重做吗?


还有第三种常见的处理撤消的方法。也就是将两种状态之间的差异存储在Undo对象内。您可以将其作为实际差异(即哪些像素已更改以及它们更改为什么)来执行此操作,但这可能几乎与在每个阶段存储位图一样浪费内存。

或者,您可以使用命令模式方法,但不是在撤消时重新运行命令,而是存储命令的逆命令 - 即,如果用户将红色值增加十,则撤消命令会将其减少十。要撤消,只需执行相反的命令即可。有些命令很难找到相反的命令,例如“转换为黑白”,但是通过将底层位图与许多由命令打开或关闭的过滤器混合,您可能可以做到这一点。

作为另一个建议,使用您提到的命令方法,但保留上一步的位图。当用户执行撤消操作时,立即显示上一 (n-1) 步骤中缓存的位图,然后开始计算 n-2 的位图,以便您为他再次按下撤消操作做好准备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用备忘录/命令模式快速撤消/重做? 的相关文章

随机推荐

  • 使用着色器时,在 QGLWidget 中使用 QPainter 而不是 OpenGL

    许多 Qt 特别是 4 6 用户都会熟悉 OpenGL 教程中提供的 Overpainting 示例 我正在尝试做一些非常相似的事情 但使用纯 OpenGL 数据的着色器 而不是旧的固定功能管道 Set background and sta
  • Highstock 在 x 轴上使用数字而不是日期

    我需要在页面上输出一个绘图 我正在考虑海斯托克或 Highcharts 来实现这一点 Highstock 界面更可取 因为导航器窗格在重新缩放后显示了绘图的其余部分 然而 我的绘图在 x 轴上有数字 但没有日期 时间 有没有办法将 High
  • 为什么我在 nginx 反向代理上收到 404?

    下面是我的配置 除了well known路线 我不明白为什么 如果我提出请求http example tech connect我收到 404 如果我向http api example tech我也得到了404 我看不出我哪里出了问题 因为这
  • 如何在 DevOps 生命周期的开发阶段使用 docker?

    我有几个与 Docker 在开发阶段的使用相关的问题 我将提出三种不同的场景来说明如何在开发环境中使用 Docker 假设我们正在 Java 和 Spring Boot 中创建一个 REST API 为此 我需要一个 MySQL 数据库 第
  • 修剪 JavaScript 中的值

    我正在尝试修剪从剑道编辑器获得的文本 如下所示 var html nbsp T nbsp This sample text I get from Kendo editor console log Actual html var text t
  • Http 媒体流服务器

    我使用 RED5 媒体服务器 RTMP 开发了视频流应用程序 需要通过 HTTP 传输实时视频 而不是 RTMP 有开源 HTTP 媒体服务器吗 有没有同时支持RTMP和HTTP的开源服务器 提前致谢 首先 HTTP 和 RTMP 是不同的
  • 如何使用 jQuery SVG 插件设置 SVG 矩形元素的背景图像?

    我使用 keith wood 的 jQuery SVG 插件创建了一个 SVG 矩形 这是代码 svg graph wrapper rect group 0 100 40 20 fill ivory stroke black strokeW
  • spring security 线程中的当前用户

    您好 我在线程范围内使用 Spring Security 时遇到一些问题 System out println User SecurityContextHolder getContext getAuthentication getPrinc
  • 在 Windows 64 位计算机上安装 pyenchant

    我想安装 PyEnchant 进行拼写检查 它需要enchant安装在我的机器上 但我能找到的所有 exe 文件都是针对 win32 系统的 有没有其他方法可以在 Windows 64 位机器上安装它 目前 Enchant 没有 64 位版
  • 名称属性中包含特定文本的复选框的 jQuery 选择器

    我试图在 jQuery 中找到一个选择器 它选择所有作为复选框的输入 并且它们的名称包含特定单词 如 top 或 Top 由于选择其他复选框而遇到麻烦 是否可以使用类似的东西 input name top type checkbox eac
  • Numpy loadtxt:ValueError:列数错误

    文件 TEST txt 的结构如下 a 45 b 45 55 c 66 当我尝试打开它时 import numpy as np a np loadtxt r TEST txt delimiter t dtype str 我收到以下错误 Va
  • 动态添加的 SELECT 元素不会在 Internet Explorer 中触发 onchange 事件

    据我所知 这只在 Internet Explorer 中被破坏 我有一个脚本 可以创建多个动态 元素并为它们添加 onchange 事件 onchange 事件在 Firefox 中触发没有问题 但在 Internet Explorer 中
  • 如何在 PHP 应用程序中供应 bcrypt(我应该)?

    我正在为一个相对成熟的开源PHP项目做出贡献 最近 我发现它将密码存储为纯 MD5 哈希值 这对我来说相当麻烦 我想如果我要修复它 我不妨做对 tm 所以我想使用 bcrypt 首先 我对其他语言的发现 bcrypt ruby似乎使用 Op
  • 如何在android中以编程方式创建GridView图片库?

    我想以编程方式创建 3x3 gridview 来显示图像 我想通过获取屏幕尺寸来设置每个项目的高度和宽度 喜欢 DisplayMetrics metrics context getResources getDisplayMetrics in
  • 如何让 Firefox 在同一窗口中打开所有通过 WebDriver 打开的链接?

    我想在同一窗口中而不是在新窗口中打开所有链接 我试过 profile setPreference browser link open newwindow 1 但结果是 WARNING traffic loop 0 error Prefere
  • 在 xcode 中设置 C++ 编译标志

    I faced with the same issue for this question Undefine symbols for architecture x86 64 using FFTW And I tried to use fla
  • 数据什么时候应该放入/data,什么时候应该放入/inst/extdata?

    The 编写 R 扩展手册指出 data 子目录用于存放数据文件 可以通过延迟加载或使用 data 进行加载 选择是通过描述文件中的 LazyData 字段进行的 默认情况下不这样做 它不应该用于包所需的其他数据文件 并且约定已经发展到使用
  • 将本机 DLL 和程序集合并为单个 DLL

    我目前正在使用 C 和 C 进行编程 使用原生 C 进行数值计算部分 最初我打算使用 C CLI 为原生 C 类制作一个包装器 但我发现这会导致速度降低 2 到 4 倍 所以我决定将我的本机 C 编译为 DLL 并通过以下方式调用 NET
  • popup.html 上的弯角?

    我想知道如何在 Chrome 扩展程序上弯曲 popup html 页面的角 我试过了 http border radius com 为所有角输入 10 并将其放入我的 CSS 主体中 但它似乎不起作用 我有什么特殊的方式来设计它吗 您是指
  • 使用备忘录/命令模式快速撤消/重做?

    我正在为手机编写一个绘画 图形 Java 应用程序 因此内存有限 应用程序状态本质上是三个 1000x500 位图 即绘画的图层 加载三个位图大约需要 2 或 3 秒 我正在尝试编写一个撤消引擎 但我无法找到一个好的方法来做到这一点 典型的