【外评】Photoshop 如何处理大于内存大小的文件
2021 年,Adobe 与 Chrome 工程团队一起将 Photoshop 的一个版本推向了网络。该软件以 SIMD、源私有文件系统中的高性能存储、画布的 P3 颜色空间以及带有 Lit 的 Web 组件等功能,创新地利用了 WebAssembly。在本文中,我们希望重点关注 Adobe Photoshop 工程处理大小超过内存容量的文件。另外,就 WebAssembly 而言,Photoshop 可以处理大于 wasm32 的 32 位地址空间的文件。
问题
打开文件进行编辑需要占用大量内存,远远超过打开文件进行查看所需的内存量。由于该软件提供的众多功能、用于数字设计和编辑的类型以及用户设备的功能,在 Photoshop 中编辑的文件通常需要比用户设备上的可用内存更多。
Photoshop 文件格式在存储数据时采用无损压缩。读取文件或文档时,所有图片数据都将被解压缩,以提高处理效率。因此,所需的内存量可能比文档在磁盘或云端存储空间中占用的空间量大好几倍。
Photoshop 支持非常长的撤消历史记录。Photoshop 中的许多操作就是我们所谓的破坏性操作。也就是说,进行修改(如使用画笔作画)将产生与原始像素数据一样大的新像素数据。长时间编辑会话会产生大量的像素数据,必须保留这些数据以支持撤消操作。因此,数据历史记录可能会增长到几百兆字节或几千兆字节。
设备和平台(无论是桌面设备、移动设备还是浏览器)都可以管理内存。其中有些 API 能够更宽松地为应用提供多少内存。内存量也因设备而异,如您所知,当您订购新的计算机或设备时,需要指定所需的随机存取存储器 (RAM) 容量。其中许多平台还支持虚拟内存,从而使应用可以使用比物理可用内存更多的内存。这种支持因操作系统和运行时而异(例如 WebAssembly 的情况),应用可能无法轻易访问或使用。除此之外,现代虚拟系统的上限可以很容易超过 Photoshop 要求的限制。
理想情况下,应用会根据需要使用尽可能多的内存。这样通常可以为用户提供最佳性能。但是,如果它们使用的内存过多,则它们可能会受到运行时平台处罚或耗尽内存,从而导致失败。
在过去的记录中,Photoshop 需要解决最初的问题是在早期版本的 macOS 上编辑打印分辨率文件,操作系统和所有应用的打印分辨率文件低至 1 MB。采用 CMYK 色彩模式的 300 dpi 全页图片在未压缩时约为 32 MB。
解决方案
为了解决应用超出可用 RAM 容量的问题,Photoshop 实现了一个软件虚拟内存系统 (VM)。Photoshop 使用其虚拟机管理文档数据(尤其是图片数据)、所有撤消历史记录和状态,以及当前命令的工作存储空间。它还可用于缓存大型数据块(例如 Brush 说明),以便只需从磁盘序列化一次这些数据。
作为虚拟机管理的一个方面的一个示例,使用 mipmap 表示法存储图片数据,此表示法是图块集的金字塔式方法,提供从低到高分辨率范围内的图片数据。这样一来,Photoshop 可以处理适当的分辨率数据,从而在放大或查看预览(与缩小相比)时更快地响应。
在应用初始化期间,Photoshop 会确定可用的 RAM 大小。它会留出一部分数据供存储在虚拟机中。其余 RAM 可通过标准 C++ 运行时库满足其他应用需求。虚拟机内存分为“页面”。每个页面通常都是设备硬件页面大小的倍数。当用于图片数据时,内存以图块的形式引用。图块是单个图层的像素(包括几何图形边界)的方形区域。一个功能块使用一个或多个页面。
Photoshop 会创建一个或多个暂存文件,为虚拟机页面提供基于磁盘的后备服务。这些临时文件存储在源私有文件系统中。该屏幕截图显示了图片编辑会话期间此类临时文件(以黄色突出显示)和其他文件的示例文件层次结构。每个临时文件可以包含多个虚拟机页面。当虚拟机需要更多支持时,它会创建额外的临时文件。页面释放后,它们在暂存文件中的空间可重复用于新页面。
在处理图像数据时,Photoshop 会迭代图块,执行像素计算。每次计算都可以引用多个图块。虚拟机负责确保当前迭代的源图块和目标图块位于内存中,并根据需要从头开始加载它们。同时,它可以将页面刷新到临时文件,以腾出内存空间。
总结
尽管虚拟机的具体实现细节远远超出了本文档的范围(并且也归 Adobe 所有),但通过对该解决方案的简要说明,我们已让您了解 Photoshop 如何处理大型文件。源私有文件系统具有高性能的文件读写访问权限,是该解决方案的关键组成部分。
致谢
此博文由 Oliver Unter Ecker 和 Rachel Andrew 审核。特别感谢 Russell Williams 围绕 Photoshop 虚拟机撰写的优秀文档。
本文文字及图片出自 How Photoshop solved working with files larger than can fit into memory
你也许感兴趣的:
- 【程序员搞笑图片】1969年 NASA 用 4KB 的内存就将人类送上了月球
- Google 也要放弃 C/C++?Chrome 代码库中 70% 的安全漏洞是内存问题
- 三招教你释放设备内存
- 小米工程师:MIUI 6是如何优化手机内存的?
- 令设计师崩溃的七个瞬间
- 具有魔法的 H.264
- 多用户环境中的 rootless Docker
- 【外评】微软的人工智能聊天机器人将 “回忆 “您在其新 PC 上所做的一切
- 【外评】苹果需要解释重新出现已删除照片的错误
- 你需要知道的现代 CSS 技巧(2024 年春季版)
你对本文的反应是: