Java2D:BufferedImage在Ubuntu上不加速

我们目前正在使用Java2D API开发Java游戏,并且在Ubuntu环境中运行时遇到了一些奇怪的性能问题。

我们的帧速率从Windows和Mac系统平均62fps下降到Ubuntu上的10fps。 经过几个小时的debugging和testing各种JVM标志,似乎是使用位掩码的BufferedImages没有在Ubuntu下加速,因为

System.out.println(img.getCapabilities(config).isAccelerated()); 

打印出假。

目前我们正在通过加载我们的图片

 img = ImageIO.read(url); 

然后使用以下方法创build兼容设备的BufferedImage:

 private static BufferedImage createCompatibleImage(BufferedImage img) { // Get default graphics device GraphicsDeviceService graphicsDevice = ServiceProvider .getService(GraphicsDeviceService.class); GraphicsConfiguration config = graphicsDevice .getGraphicsConfiguration(); // Get desired transparency mode int transparency = img.getColorModel().hasAlpha() ? Transparency.BITMASK : Transparency.OPAQUE; // Create device compatible buffered image BufferedImage ret = config.createCompatibleImage(img.getWidth(), img.getHeight(), transparency); // Draw old image onto new compatible image Graphics2D graphics = ret.createGraphics(); graphics.drawImage(img, 0, 0, null); graphics.dispose(); // Return compatible image return ret; } 

当使用Transparency.OPAQUE创build兼容的BufferedImages时,上面的第一行代码将打印出true,这表示图像现在加速并且帧频似乎恢复正常。

然而,这当然不是我们想要的解决scheme,因为图像的绘制没有任何透明度,而是具有丑陋的黑色背景。

那么,有没有人知道这个问题的解决scheme?

我相信麻烦在于,您在硬件加速环境中使用BITMASK。

我不清楚限制在哪里。

  • 只有VolatileImage? 还是它也适用于BITMASK BufferedImage实例?
  • 它是否适用于OpenGL和Direct3D管道? (不谨慎的这个线程; OpenGL是Linux上唯一可用的)

在任何情况下,“解决方案”是仅在软件渲染环境中使用BITMASK图像; 在硬件加速环境中,您需要使用TRANSLUCENT图像。 我很难找到一个有效的来源,而不是一个较老的javagaming.org线程,所以我唯一能说的就是试试看。

http://www.java-gaming.org/index.php?topic=19561.5