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

15 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中的窗口,现在当我调整窗口大小并使其非常小时,图像也会缩小并且变小.突然间,一切都顺利进行,当我将它缩放到它仍然平稳运行之前的大小!

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

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

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

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

这可能是Java中的错误吗?

DJC*_*rth 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();
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这对我来说非常出色,谢谢!我使用此代码与getRGB/setRGB一起转换我的BufferedImage (3认同)

Kit*_*YMG 5

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

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

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

看看sun.java2d.trace哪些可以使您确定不良性能的来源。


sch*_*der 2

有几件事可能会影响这里的性能:

  • 可用内存
  • 中央处理器速度
  • 显卡(板载或独立)
  • 图形驱动程序
  • Java版本
  • 使用的视频模式(分辨率、位深度、加速支持)

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

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

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

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