内存和渲染性能
2026年03月12日 ·版本 0.3.4
Fog Panther v0.3.4 带来一系列内部优化,大幅降低内存占用并提升渲染性能,对大型文档和长时间编辑尤为明显。
压缩的历史记录
还原系统现在以 zstd 压缩数据存储拼贴快照,而不是完整的未压缩副本。以往每次画笔描边、填充或应用滤镜都会存储 16 KB 的原始拼贴缓冲区,现在会在捕获时使用 zstd 1 级压缩,速度约为 500 MB/s。
结果是:视拼贴内容而定,每个还原步骤占用的内存减少到原来的 1/3 至 1/10。固定的 256 MB 还原预算以前大约能容纳 80 次较大的画笔描边,现在实际可容纳 250 到 800 次。还原和重做依然即时完成:解压一个拼贴大约只需 11 微秒。
磁盘上的 FOG 格式本已使用 zstd 压缩,因此已存储的文件不受影响。只有内存中的表示方式发生了变化。
显示表面缓存
非 RGBA8 像素格式(RGBA16、CMYKA、灰度)需要经过格式转换,才能生成用于屏幕显示的 Cairo ARGB32 表面。此前,每一帧都要对每个可见拼贴执行这一转换。
现在,拼贴会在首次转换后缓存其显示表面。每当拼贴数据发生变化,缓存会自动失效。对于有 200 个可见拼贴的 16 位文档,这在平移和缩放时每帧可省去 200 次格式转换。
主动修剪拼贴缓存
拼贴缓存以前要等到超出内存上限才会逐出条目,导致内存短暂超限。现在它在达到 90% 容量时就开始修剪,并修剪到 85%,形成一个迟滞区间,避免下一次插入时反复逐出。
棋盘格图案缓存
透明棋盘格图案在每一帧都会绘制在每个文档后面,以前每次渲染都要创建并销毁它。现在它只创建一次,并在进程的整个生命周期内重复使用。
错误修复
本版本还包含在审查优化工作时发现的若干正确性修复:
- 所有写入像素的函数现在都会正确使显示缓存失效,而不仅仅是原始数据访问器
- 当压缩拼贴解压为空拼贴时,历史记录序列化不再写入格式错误的标志字节序列
- 重做擦除操作时现在能正确恢复空拼贴
- 用不同像素格式的拼贴替换已缓存的拼贴时,拼贴缓存的内存统计现在是正确的
- 棋盘格图案的初始化现在是线程安全的