2009-02-01 149 views
3

我正在研究Java 2D渲染程序(在1.6.0_11上运行),该程序使用外部图像进行UI渲染。这些大图像同时包含几个UI图形部分,现在我使用BufferedImage.getSubimage()提取这些部分。假设平均桌面系统(有或没有启用的DirectX/OpenGL加速),我的问题是:BufferedImage的getSubimage性能

  • 的getSubimage()是一个内存高效的呼叫,因为它共享底层的图像数据,但是这并不影响渲染这些子图像与Graphics2D.drawImage()的速度?
  • 如果图像使用8位每像素调色板模式,使用RGBA模式(例如4x内存)或依赖调色板颜色模型(例如转换时间)的增益/损耗是多少?
+0

事实证明,这有点灰色地带。如果未使用DirectX管道,则每次提取子图像需要多一点时间,而不是具有单独的子图像图像。如果图像是需要特殊坐标系进行渲染的图块,则差异很明显。 DirectX开启后,BufferedImage将成为托管映像 - 位于视频内存中 - 并利用卡硬件支持。在这种情况下,子图像和非子图像之间没有显着差异。 – akarnokd 2009-05-01 08:05:44

回答

1

据我所知,getSubimage(...)应该不会对渲染有任何显着的影响。

转换图像数据很慢,通常最好避免在飞行中进行。


带图像缓慢可分为两大类:

  • 磁盘I/O
  • 数据处理

和磁盘I/O可以很容易地最慢的部分。

如果您打算仅使用图像的一部分,最好能够从磁盘加载部分图像。

我的经验是,JAI比只使用标准库的东西更好。

+0

这不是磁盘I/O时间,因为源映像已完全加载到内存中。这个合成图像的样本可以在http://karnokd.uw.hu/open-ig-starmap.png看到。所有UI图形组件都是从这种图像中提取的。 – akarnokd 2009-02-10 07:29:31