我正在为 2D 绘图开发具有使用图层功能的简单应用程序。我尝试了不同的平台(.NET、Java、QT...),但我总是遇到同样的问题。我无法理解如何有效地将所有图形图层/图像/位图存储在内存中,尤其是当画布(存储图形数据的每个对象)尺寸很大(如 3000x3000 像素左右)时。我想除了将每一层存储为图像/位图对象(或任何仍会消耗大量内存的颜色数据数组)之外别无他法。
我已经尝试过的:
- 将所有图层对象直接存储在内存中。我可以快速访问这些对象,但是如果画布尺寸太大并且有很多图层对象,程序经常由于内存使用溢出而崩溃。
- 仅将“活动”层对象存储在内存中,同时将所有其他层缓存在硬盘上。但是每次用户绘制笔画以重建新的最终“可见”图像时,我仍然需要访问所有图层对象。而且当我从硬盘访问所有缓存的图层对象时,它真的很慢,因为我需要将它们一个一个地重新分配到内存中,然后将它们杀死。
- 压缩所有图层对象中的图形数据并将其存储在内存中。但是同样,当我每次需要重建最终的可见图像时,我都必须将图形数据逐个解压缩,这也很慢。
那么存储大量图形对象的正确方法是什么?像 Photoshop 这样的流行软件如何能够处理许多大图层并且仍然可以快速运行?有人知道吗?
- - 解决方案 - -
好的!感谢 evilruff,我解决了这个问题。看起来当我从缓存文件中读取一小部分所需的层时,内存分配的速度比我尝试分配整个层时快得多。
这是我所做的:
- 在图层对象初始化时,我在硬盘驱动器上创建新文件,填充零字节(透明像素)。这样,图层的图形数据就不会存储在内存中。
- 当我需要从图层对象获取位图/图像切片时,我会传递切片区域坐标。layer-object 中的方法创建新的空位图/图像并将其“位”替换为缓存文件的数据,从根据区域的正确步幅和位置开始。
- 在完成对位图/图像的所有操作后,我将其传递回另一个图层对象的方法,该方法使用位图/图像的新“位”更新缓存文件。之后,我只是从内存中刷新位图/图像。
工作速度非常快,内存中只分配了一个可见的位图/图像。
不好的一面:每一层的缓存文件仍然占用硬盘空间。但如今,当每个人都有大硬盘时,这并不重要。