【发布时间】:2010-12-28 02:21:19
【问题描述】:
我被告知要设计一个有两种变体的画笔程序,一种使用大量空间和少量 cpu,而另一种则相反。
这个想法(我被告知 - 所以不确定)以某种方式保存屏幕快照而不是保存代表绘画之间差异的 XOR 映射(我不知道这意味着什么)。
有人可以建议一种方法或添加相关材料的链接吗?
【问题讨论】:
标签: c++ user-interface graphics gdi
我被告知要设计一个有两种变体的画笔程序,一种使用大量空间和少量 cpu,而另一种则相反。
这个想法(我被告知 - 所以不确定)以某种方式保存屏幕快照而不是保存代表绘画之间差异的 XOR 映射(我不知道这意味着什么)。
有人可以建议一种方法或添加相关材料的链接吗?
【问题讨论】:
标签: c++ user-interface graphics gdi
使用屏幕截图的明显位置是实现“撤消”命令。简单的、占用内存的方法是在每个动作之前拍摄屏幕快照。如果用户点击“撤消”,您可以恢复旧屏幕。
为了节省内存空间,您只需通过异或运算来保存两个屏幕之间的差异。就其本身而言,这实际上并没有节省任何空间,但它将所有未更改的像素设置为 0。为了节省空间,您需要应用某种压缩。鉴于您通常可以预期相当大的区域都为零,游程编码可能会快速有效。对于运行长度编码,您通常会将相同字节的字符串转换为两个字节,第一个保存运行长度,第二个保存值。例如,一行中的 75 个零将被编码为 75 0。
如果您想更进一步,您可以考虑使用元文件,而不是保存异或位图。元文件记录在 Windows GDI 调用级别执行的操作,因此(例如)如果您在 10、100 处绘制一个红色的 100x200 矩形,它基本上会记录 - 即,而不是两万像素,它将保存一个标识符说明要执行的 GDI 函数,以及提供给该函数的参数。在典型情况下,每个执行的“命令”可能平均大约 15-20 个字节。同时,它确实(通常)涉及更多的计算——例如,如果你画一个圆,重新运行一个元文件需要重新光栅化这个圆,而不是仅仅存储它产生的位。
【讨论】: