Java中的Graphics.drawImage()在某些计算机上非常慢,而在其他计算机上则要快得多

我有一个奇怪的问题,基本上在Java Graphics.drawImage()在某些计算机上速度极慢而在其他计算机上速度更快。 这与计算机能力无关,一些较弱的计算机运行良好,而一些较强的计算机似乎在drawImage调用时窒息。

它可能与宽度和高度有关,也可能没有,我有一个非常非常大的宽度和高度定义(类似于5000乘2500)。 我不认为这是问题,除了我说它在某些计算机上以实时速度运行而在其他计算机上运行较慢并且似乎与计算机相对功率无关。

两台计算机都使用相同版本的Java,都使用Vista。 一个拥有1.83ghz Core 2 Duo,1GB内存和板载显卡(运行一切正常),另一个拥有2.53 ghz核心2 duo和9600GS(最新nVidia驱动程序)和4GB内存,它在drawImage调用上真的很明显。

有任何想法吗?

编辑:确定这真的很奇怪,我正在将图像绘制到Swing中的窗口,现在当我调整窗口大小并使其非常小时,图像也会缩小并且变小。 突然间,一切都顺利进行,当我将它缩放到它仍然平稳运行之前的大小!

它还有多个监视器问题,如果我执行resize技巧以使其在一个监视器上运行得更快,然后将其滚动到另一个监视器,当超过一半的窗口在新监视器中时它再次启动。 我必须再次调整窗口大小然后回到原来的大小以恢复速度。

如果我在一台显示器上进行resize的技巧,将它移动到另一台显然是chugs,但是如果我将它返回原来的显示器,我做了resize的技巧它100%工作

如果我打开两个摆动窗口(显示相同的图像),它们都运行缓慢,但如果我在一个窗口上执行resize的技巧,它们都会开始顺利运行(但情况并非如此)。

*当我说调整窗口大小时,我的意思是尽可能小到实际看不到图像的程度。

这可能是Java中的错误吗?

将图像写入屏幕的性能很大程度上受到存储图像的格式的影响。 如果格式与屏幕内存需要的格式相同则可以非常快; 如果不是那么必须进行转换,有时是逐个像素,这是非常慢的。

如果您可以控制图像的存储方式,则应将其存储为屏幕正在查找的格式。 以下是一些示例代码:

GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice device = env.getDefaultScreenDevice(); GraphicsConfiguration config = device.getDefaultConfiguration(); BufferedImage buffy = config.createCompatibleImage(width, height, Transparency.TRANSLUCENT); Graphics g = buffy.getGraphics(); 

如果要多次绘制图像,即使它采用其他格式,也可能需要转换为兼容格式。

如果你在绘制时改变它,绘制图像也会变慢,你的描述中的“resize”部分让我觉得你可能会这样。 再次,resize一次(调整窗口大小时)并缓存resize和兼容的图像,以便可以快速重绘。

如果您正在使用sun的Java,请尝试以下某些系统属性,作为命令行参数或main中的第一行

 sun.java2d.opengl = true //强制ogl  
 sun.java2d.ddscale = true //仅在使用direct3d时  
 sun.java2d.translaccel = true //仅在使用direct3d时  

可以在此页面查看更多标志

查看sun.java2d.trace ,它可以让您确定不太理想的图形性能的来源。

有几件事可能影响这里的表现:

  • 可用内存
  • CPU速度
  • 显卡(板载或单独)
  • 图形驱动
  • Java版本
  • 使用的video模式(分辨率,bitdepth,加速支持)

编辑:看看编辑后的问题,我建议检查9600GS系统是否安装了最新的NVIDIA驱动程序。 我最近安装了一个英特尔板载显卡的驱动程序,取代了通用的Windows驱动程序,使移动窗口,观看video,浏览等更快。

所有其他规格看起来都不错。 也许Java没有检测到9600GS并且没有使用硬件加速,但我对此表示怀疑。

另请检查操作系统配置。 在Windows上,您可以关闭硬件加速以进行调试。

当然,处理此问题的最佳方法是更改​​代码 – 调整图像大小或将其拆分为DNS建议的块。 你将永远无法看到屏幕上的整个图像。

你是如何判断计算机的力量的? 50×25 K 32位映像需要超过4.5 GB RAM才能保存在内存中(50000 * 25000 * 4字节)。 如果一台计算机的RAM比另一台计算机多,那么速度会有很大差异,因为它不必经常交换到磁盘。 您应该考虑抓取图像的子部分并使用它们,而不是整个部分。

编辑:您使用的是最新的Java和图形驱动程序吗? 如果你的图像只有5Kx2.5K,我唯一能想到的就是它没有任何硬件加速就能做到。

检查屏幕设置。 我敢打赌,两个系统的像素深度不同,慢速的像素深度与您试图显示的图像对象有关。

由于Java 使用OpenGL进行2D绘图 ,因此应用程序的性能将受到相应计算机中图形芯片的OpenGL性能的影响。 在3D行业中对OpenGL的支持正在减少,这意味着(具有讽刺意味的是)新的芯片在OpenGL渲染时可能比旧的更慢 – 不仅是因为硬件而且还有驱动程序。

您是否尝试过全屏独占模式?

这可能会有所帮助: http : //download.oracle.com/javase/tutorial/extra/fullscreen/index.html