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

时间:2009-03-18 12:31:10

标签: java graphics

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

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

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

有什么想法吗?

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

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

如果我在一台显示器上进行调整大小的技巧,将其移动到另一台显卡上,但是如果我将它返回原来的显示器,我做了调整大小的技巧,它可以100%工作

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

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

这可能是Java中的错误吗?

7 个答案:

答案 0 :(得分:23)

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

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

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

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

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

答案 1 :(得分:5)

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

sun.java2d.opengl=true  //force ogl  
sun.java2d.ddscale=true //only when using direct3d  
sun.java2d.translaccel=true //only when using direct3d  

可以在this page

查看更多标记

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

答案 2 :(得分:2)

有几件事可能会影响绩效:

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

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

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

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

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

答案 3 :(得分:2)

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

编辑:您使用的是最新的Java&显卡驱动?如果您的图像只有5Kx2.5K,我唯一能想到的就是它没有任何硬件加速就可以了。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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