Java2D:BufferedImage在Ubuntu上没有加速

时间:2011-06-09 09:16:19

标签: java performance ubuntu java-2d

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

我们的帧速率从Windows和Mac系统的平均62fps下降到Ubuntu上的大约10fps。经过几个小时的调试和测试各种JVM标志后,看起来使用位掩码的BufferedImages在Ubuntu下没有加速,因为

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

打印出错误。

目前我们正在通过

加载我们的图片
img = ImageIO.read(url);

然后使用以下方法创建兼容设备的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创建兼容的BufferedImages时,标记上面的第一行代码打印出true,表示图像现在已加速,帧速率似乎恢复正常。

然而,这当然不是我们想要的解决方案,因为根本没有透明度地绘制图像,而是具有难看的黑色背景。

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

1 个答案:

答案 0 :(得分:1)

我认为问题在于您在硬件加速环境中使用BITMASK。

我不清楚限制的位置。

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

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

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