我有一个奇怪的问题,基本上在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中的错误吗?
将图像写入屏幕的性能很大程度上受到存储图像的格式的影响.如果格式与屏幕内存需要的格式相同则可以非常快; 如果不是那么必须进行转换,有时是逐个像素,这是非常慢的.
如果您可以控制图像的存储方式,则应将其存储为屏幕正在查找的格式.以下是一些示例代码:
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice device = env.getDefaultScreenDevice(); GraphicsConfiguration config = device.getDefaultConfiguration(); BufferedImage buffy = config.createCompatibleImage(width, height, Transparency.TRANSLUCENT); Graphics g = buffy.getGraphics();
如果您要多次绘制图像,即使它采用其他格式,也可能需要转换为兼容格式.
如果您在绘制时对其进行变换,绘制图像的速度也会变慢,因此描述中的"调整大小"部分会让我觉得您可能会这样.再次,调整大小一次(调整窗口大小时)并缓存调整大小和兼容的图像,以便可以快速重绘.
如果您使用的是Sun的Java,请尝试以下某些系统属性,作为命令行参数或main中的第一行
sun.java2d.opengl = true //强制ogl sun.java2d.ddscale = true //仅在使用direct3d时 sun.java2d.translaccel = true //仅在使用direct3d时
可以在此页面上查看更多标志
看看sun.java2d.trace
哪些可以使您确定不良性能的来源。