在内存中存储大量图形数据(原理)

时间:2013-04-19 07:03:37

标签: java .net qt graphic

我正在开发具有使用图层功能的2D绘图的简单应用程序。我尝试了不同的平台(.NET,Java,QT ......),我总是遇到同样的问题。我无法理解如何有效地将所有图形层/图像/位图存储在内存中,尤其是当canvas(每个存储图形数据的对象)大小很大时(如3000x3000像素左右)。我想除了将每一层存储为图像/位图对象(或任何仍会消耗大量内存的颜色数据数组)之外别无他法。

我已经尝试过:

  • 将所有图层对象直接存储在内存中。我可以快速访问这些对象,但如果画布大小太大而且有很多层对象,程序经常因内存使用量溢出而崩溃。
  • 仅在内存中存储“活动”图层对象,同时保持所有其他图层缓存在硬盘驱动器上。但是每当用户绘制笔划以重建新的最终“可见”图像时,我仍然需要访问所有图层对象。当我从硬盘驱动器访问所有缓存的图层对象时,它真的很慢,因为我需要逐个将它们全部分配到内存中并在之后将其终止。
  • 压缩所有图层对象中的图形数据并将其存储在内存中。但是,当我每次需要重建最终可见图像时,我必须逐个解压缩图形数据时,它也非常慢。

那么存储大量图形对象的正确方法是什么?像Photoshop这样的流行软件如何处理许多大图层并且仍能快速工作?有谁知道吗?

---- S O L U T I O N ----

好!感谢邪恶,我解决了这个问题。 看起来当我从缓存文件中读取一小块需要的图层时,内存分配比我尝试分配整个图层时要快得多。

这就是我的所作所为:

  • 在图层对象初始化时,我在硬盘上创建新文件,填充零字节(透明像素)。这样,图层的图形数据不会存储在内存中。
  • 当我需要从图层对象获取位图/图像切片时,我会传递切片区域坐标。层对象中的方法创建新的空位图/图像,并用缓存文件的数据替换它的“位”,从根据区域的正确步幅和位置开始。
  • 在完成位图/图像的所有操作之后,我将其传递回另一个图层对象的方法,该方法使用位图/图像的新“位”更新缓存的文件。之后我只是从内存中刷新位图/图像。

工作速度非常快,内存中只分配了一个可见的位图/图像。

不好的一面:每个图层的缓存文件仍占用硬盘的空间。但是现在每个人都拥有大型硬盘并不重要。

1 个答案:

答案 0 :(得分:0)

嗯,这取决于你的图纸的性质是什么?它们最初是基于矢量的(如地图,图表是什么)或者您使用一组光栅图像作为一组图层?