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

2022-09-03 04:47:44

我遇到了一个奇怪的问题,基本上在Java Graphics.drawImage()中,某些计算机的速度非常慢,而其他计算机上速度更快。这也与计算机的功率无关,一些较弱的计算机运行良好,而一些较强的计算机似乎在drawImage调用时窒息。

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

两台计算机都有相同版本的Java,都使用Vista。一个具有1.83ghz Core 2 Duo,具有1gb RAM和板载图形(运行一切正常),另一个具有2.53 ghz Core 2 Duo,带有9600GS(最新的nVidia驱动程序)和4gb RAM,它在drawImage调用中确实很糟糕。

有什么想法吗?

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

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

如果我在一台显示器上执行调整大小技巧,请将其移动到另一台显示器上,当然会嘎嘎作响,但是如果我将其返回到我执行调整大小技巧的原始显示器,它可以100%工作

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

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

这可能是Java中的一个错误吗?


答案 1

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

如果对图像的存储方式有任何控制权,则应以屏幕要查找的格式存储图像。下面是一些示例代码:

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

如果您要多次绘制图像,即使它以其他格式出现,也值得转换为兼容格式。

如果您在绘制时对其进行转换,则绘制图像也会变慢,而描述中的“调整大小”部分使我认为您可能会这样做。同样,请调整一次大小(当窗口调整大小时)并缓存调整大小和兼容的图像,以便可以快速重绘。


答案 2

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

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

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

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


推荐