java存储大量数据_关于Java:在内存中存储大量图形数据(原理)

我正在开发具有使用图层功能的2D绘图简单应用程序。我尝试了不同的平台(.NET,Java,QT ...),但始终遇到相同的问题。我不明白如何有效地将所有图形图层/图像/位图存储在内存中,尤其是当画布(每个存储图形数据的对象)的尺寸很大(例如3000x3000像素左右)时。我想别无选择,只能将每一层存储为图像/位图对象(或仍然会消耗大量内存的任何一种颜色数据数组)。

我已经尝试过的

将所有层对象直接存储在内存中。我可以快速访问这些对象,但是如果画布大小太大并且有许多层对象,则程序经常会由于内存使用溢出而崩溃。

在内存中仅存储"活动的"层对象,同时将所有其他层保留在硬盘驱动器上。但是,每当用户绘制笔触以重建新的最终"可见"图像时,我仍然需要访问所有层对象。而且,当我从硬盘驱动器访问所有缓存的层对象时,它的速度确实很慢,因为我需要一次又一次地将所有它们分配在内存中,然后将其杀死。

压缩所有图层对象中的图形数据并将其存储在内存中。但是同样,当我每次需要重建最终的可见图像时都必须一次解压缩图形数据时,它的速度也确实很慢。

那么,存储大量图形对象的正确方法是什么?诸如Photoshop之类的流行软件如何处理许多大型图层,并且仍然可以快速运行?有人知道吗?

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

好的!多亏了evilruff,我解决了这个问题。

看起来当我从缓存的文件中读取所需的一小层切片时,内存分配的处理速度比我尝试分配整个层时要快得多。

这是我所做的:

关于层对象初始化,我在硬盘驱动器上创建了一个新文件,并填充了零字节(透明像素)。这样,图层的图形数据就不会存储在内存中。

当我需要从图层对象获取位图/图像切片时,可以传递切片区域坐标。层对象中的方法创建新的空位图/图像,并用缓存文件的数据替换其"位",并根据区域从正确的步幅和位置开始。

完成对位图/图像的所有操作后,我将其传递回另一个层对象的方法,该方法使用位图/图像的新"位"更新缓存的文件。之后,我只是从内存中刷新位图/图像。

工作非常快,并且内存中仅分配了一个可见的位图/图像。

不好的一面:每层缓存的文件仍然占用硬盘驱动器的空间。但是如今,当每个人都拥有大型硬盘时,这并不重要。

"我想除了将每一层存储为图像/位图对象外,别无其他方法"对于Java,您可能只在需要时才加载它们,然后在内存中将它们刷新。 但是..请选择一种语言。

有时,使用ram的最快方法并不总是最节省空间的,您是在寻找中间立场还是一个或另一个更重要?

@AndrewThompson是的,我尝试从内存中刷新图形数据并将其存储在硬盘驱动器上,正如我在已经尝试过的列表中提到的那样。 语言/平台对我而言并不是真正的问题。 我基本上只是想弄清楚原理。

@TaylorFlores我只想弄清楚如何像所有其他绘画软件一样,以最小的内存消耗快速从所有图层对象访问图形数据。

好吧,这取决于..您图纸的性质是什么? 它们最初是基于矢量的(如地图,图表等)还是要处理放置为一组图层的一组光栅图像?

是的,它是一组光栅图像。 我需要存储每层每个像素的颜色数据。

然后(当然,这取决于图像的大小和层的数量),但是您可以考虑对需要动态加载的零件进行切片。 逻辑可能很复杂,但是您可以保证程序消耗的内存量是固定的,而不取决于图像大小。

因此,您需要的是根据图像制作一组拼贴,并制定一种逻辑来动态操纵不同图层上的拼贴。

谢谢! 看起来不是从缓存文件访问整个层,而是访问其中的一小片确实更快。 我用解决方案更新了我的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值