PhotoCraft复制写时(COW)稀疏瓦片技术揭秘:大画布为何内存占用只有1/3
【免费下载链接】photocraftAn open-source, clean-room reimplementation of Adobe Photoshop in pure Rust项目地址: https://gitcode.com/gh_mirrors/pho/photocraft
PhotoCraft 是一个用纯 Rust 编写的开源 Photoshop 重实现项目。它最核心的性能设计之一,就是位于 crates/raster/src/lib.rs 的复制写时(Copy-on-Write)稀疏瓦片(Sparse Tiles):把画布切成 256×256 的小块,只在"有内容"的地方分配内存,复制画布只复制指针不复制像素。正是这套机制,让超大画布的内存占用可以做到全量存储的约 1/3,撤销(Undo)也因此变得极其廉价。
稀疏瓦片:不用的像素不占内存
传统图像软件里,一张画布就是一整块连续内存:6000×4000 像素的 8 位 RGBA 文档,光是"空着"就要吃掉96 MB。而 PhotoCraft 的画布是一个无限平面的 256×256 瓦片网格(瓦片尺寸定义在 crates/geom/src/lib.rs):
- 没画到的瓦片根本不存在——读的时候按"默认像素"返回(图层是透明,蒙版是白色);
- 上面这张 6000×4000 的画布,理论上需要 24×16 = 384 个瓦片,每个瓦片 256 KB;
- 如果画面内容只覆盖 1/3 的画布(其余透明),实际分配的瓦片就少 2/3——96 MB 直接降到约 32 MB,这就是"1/3 内存"的来源。
关键 API 是Surface::tile_mut:第一次写入某块瓦片时才分配内存,读像素的read_pixel对缺失瓦片零开销。
复制写时(COW):克隆画布 = 复制指针
更巧妙的是每个瓦片都用 Rust 的Arc(原子引用计数)共享存储。于是:
- 克隆整个画布是 O(瓦片数) 的指针拷贝,不复制任何像素字节;
- 谁要修改某块瓦片,才复制那一块(
Arc::make_mut),其他瓦片继续共享; - 画满 4 个瓦片的图,改 1 个像素后,两份"画布"实际只有 1 块瓦片是独立的——单元测试
copy_on_write_shares_untouched_tiles精确验证了这一点。
还有一个"瘦身"收尾动作:Surface::prune会把被擦回默认像素的瓦片直接释放,配合content_bounds从瓦片外圈向内扫描,快速算出内容边界——全画布选择时只扫描外圈瓦片,而不是每个像素。
撤销历史:每一步都"几乎免费"
这套瓦片直接决定了撤销功能的实现哲学(crates/ops/src/lib.rs):历史栈里存的是整文档快照,听起来很费内存?但因为瓦片共享,一份"快照"只是几百个指针的拷贝:
- 连续做 50 步调整,历史中 49 份快照与当前文档共享绝大部分瓦片,只有真正被修改过的瓦片才计入内存;
- 内存预算按"历史独占、未共享的像素字节"结算(
History::held_bytes),超预算时从最旧的快照开始淘汰,最近一步永远保留; - 同一机制还让后台任务(导出、自动保存)可以把瓦片"借走"再还回(
take_tiles/put_tiles),主线程继续编辑也不冲突。
这正是官方对它的总结——README 中的 Copy-on-write tiles 特性条目:"256² 稀疏瓦片让撤销很廉价,让巨大的画布很轻盈。"
性能收益一览
| 场景 | 朴素方案 | PhotoCraft 瓦片方案 |
|---|---|---|
| 6000×4000 空白 RGBA 画布 | 96 MB | ≈ 0(只有元数据) |
| 内容占 1/3 画布 | 96 MB | ≈ 32 MB |
| 记录一步撤销 | 复制整张画布 | 复制指针 + 改动瓦片 |
| 读取空白区域 | 遍历像素 | 按默认像素填充,跳过缺失瓦片 |
延伸阅读
- 瓦片表面完整实现:crates/raster/src/lib.rs
- 撤销历史与内存预算:crates/ops/src/lib.rs
- 瓦片常量与网格坐标:crates/geom/src/lib.rs
- 渲染管线如何按瓦片跳过空块:book/src/architecture/rendering.md
- .pcraft 文件格式如何按内容寻址存储瓦片:book/src/formats/pcraft.md
简单说:稀疏 = 没画的不占内存,COW = 没改的不复制内存。两个"懒"加在一起,大画布编辑从"内存灾难"变成了几百个指针的小事——这也是 PhotoCraft 作为纯 Rust 图像处理引擎能在消费级硬件上流畅运行的关键原因之一。
【免费下载链接】photocraftAn open-source, clean-room reimplementation of Adobe Photoshop in pure Rust项目地址: https://gitcode.com/gh_mirrors/pho/photocraft
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考