

金山画王经典版 的卖点里,有一项和"画画"本身不太相干:
绘画过程回放——自动记录从第一笔涂鸦到完成作品的全过程,可以保存绘画步骤。
"保存绘画步骤"这个说法值得琢磨。
因为顺着一想就会发现:它能回放,说明它内部一直在记东西——而且记的不是"画面",是"动作"。
这件事和另一个更常用的功能是同一套东西:撤销。
先把两种记法分清楚。
第一种记法:记结果。 每做完一步,就把整张画布拍一张"照片"存下来。撤销就是"把上一张照片放回来"。
第二种记法:记动作。 存下"用了什么笔、什么颜色、从哪里画到哪里、什么时间画的"。画布不存,需要的时候按记录重新画一遍。
"回放"这件事,只有第二种记法才做得到——因为回放要的不是最终画面,而是"中间每一笔是怎么来的"。
所以这条卖点其实透露了它的内部结构:
它维护的是一条操作记录,而不是一堆画面快照。
想通这一点,撤销的几个"怪现象"就好解释了。
两者用的都是同一份东西——操作序列:
方向相反,数据同源。
由此可以推出一件有意思的事:"能回放"往往不是单独做出来的功能,而是"用操作记录来管理"这种做法的副产品。
选了这套结构,回放几乎是顺手就能提供的;而如果一开始选的是"存快照",那回放就得从头再做一套。
所以这两个功能看起来是两件事,实际上是一件事的两面。
两种都不是"更好",而是把困难放在了不同位置。
"记结果"的困难在内存上:画布一大、步数一多,占用涨得很快。
"记动作"的困难在可逆性上:大部分绘画动作(画一笔、贴一个素材)是容易反向的——把"画上来"变成"擦下去"就行。但有些操作本质不可逆:
这些操作没有一个简单的"反操作"——你没法用"撤销模糊"这种动作把它变回去,因为模糊已经把信息丢掉了。
于是这类软件通常只能退一步:在做这类操作之前,先偷偷记下"受影响那一块原来的样子",撤销时把那一块贴回去。
这就解释了一个常见体验:
为什么有些操作能撤,有些撤了就回不到原样。
差别不在"优先级",而在"这个操作有没有一个能反向执行的动作"。
现象一:撤销步数总是有限的。
因为每一步都要占资源——无论走哪条路线,成本都不为零。
而且成本不是恒定的:画布越大、图层越多,每一步越"重"。 所以"把撤销步数调到很大"会直接反映在内存占用上,这不是保守,是换算关系。
现象二:想撤最后一笔,却一下子撤掉好几笔。
因为连续的操作常常被"合并"成一条记录。 这是为省记录做的合并——原理上省了空间,代价是撤销的粒度变粗了。
所以"撤销不够精细"和"记录占用太大"往往是同一个取舍的两面。
现象三:回放出来的效果,和当时画的不完全一样。
因为回放依赖"操作能被重复执行"。 只要某个操作的结果依赖于当时的状态(当时的颜色设置、当时的素材版本、时机相关的效果),重演时就可能出现偏差。
换句话说:回放要求操作是"可重复的",而现实中总有一部分操作只能"大致重复"。
这一点和它的年代有关——金山画王经典版 的默认值,正是当年硬件条件的产物。
当年机器的内存量级小得多,所以默认的撤销步数、画布尺寸都偏保守。"经典版"在这些默认值上尤其明显。
而这里有一个容易被忽略的换算关系:
画布尺寸翻倍,每一步的代价不是翻倍,而是四倍。
因为画布的像素数量是"长 × 宽"。 所以在大画布上,可用的撤销步数会掉得比预想的快得多——这也是老软件一放到大尺寸画布上就开始吃力、甚至直接报内存不足的原因。
在现代机器上,把步数调高是可行的(这也是它今天还能顺畅使用的原因之一),但那条换算关系没有变:画布和步数之间,始终是在同一份内存里做取舍。
第三行要特别提醒:"保存下来的作品"和"以后还能改的作品"是两回事。 页面上说作品可以存成图片格式——图片是给看的,不是给改的。如果希望以后还能继续编辑,要保留软件自己的工程文件。
关于 金山画王经典版 这类绘画软件的"撤销"与"回放",记住四条:
这里可以带走的经验是关于"记录单元"的:任何"可以退回去"的功能,都必须先回答一个问题——你记录的是什么?
记结果(快照)、记差异、还是记动作,这三种选择同时决定了三件事:占用多少空间、能退多远、以及能不能重放。
数据库的事务日志、编辑器的历史记录、部署的回滚点,面对的都是同一个选择——先定记录单元,再谈能撤销多少步;顺序反了,就会出现"想撤却撤不动"或者"空间开销大到不能接受"这两种都不想要的结果。
https://www.ijinshan.com/software/jshw.html?channel=4109
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。