返回新闻稿

内存和渲染性能

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%,形成一个迟滞区间,避免下一次插入时反复逐出。

棋盘格图案缓存

透明棋盘格图案在每一帧都会绘制在每个文档后面,以前每次渲染都要创建并销毁它。现在它只创建一次,并在进程的整个生命周期内重复使用。

错误修复

本版本还包含在审查优化工作时发现的若干正确性修复:

  • 所有写入像素的函数现在都会正确使显示缓存失效,而不仅仅是原始数据访问器
  • 当压缩拼贴解压为空拼贴时,历史记录序列化不再写入格式错误的标志字节序列
  • 重做擦除操作时现在能正确恢复空拼贴
  • 用不同像素格式的拼贴替换已缓存的拼贴时,拼贴缓存的内存统计现在是正确的
  • 棋盘格图案的初始化现在是线程安全的