☰
PhotoCraft复制写时(COW)稀疏瓦片技术揭秘:大画布为何内存占用只有1/3
2026/10/7 21:35:38 网站建设 项目流程

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(原子引用计数)共享存储。于是:

  1. 克隆整个画布是 O(瓦片数) 的指针拷贝,不复制任何像素字节;
  2. 谁要修改某块瓦片,才复制那一块(Arc::make_mut),其他瓦片继续共享;
  3. 画满 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询