Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java2D: BufferedImage not accelerated on Ubuntu

We are currently developing a game in Java using the Java2D API and are experiencing some strange performance issues when running it in an Ubuntu environment.

Our frame rate drops from an average of 62fps on Windows and Mac systems to about 10fps on Ubuntu. After some hours of debugging and testing various JVM flags it seems to be that BufferedImages using a bitmask are not being accelerated under Ubuntu because

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

prints out false.

Currently we are loading our images via

img = ImageIO.read(url);

and are then creating a device compatible BufferedImage using the following method:

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;
}

When creating compatible BufferedImages using the Transparency.OPAQUE, flag the first line of code above prints out true, which indicates that the image is now accelerated and the frame rate seems to be back at normal.

However this is of course not our desired solution since the images get drawn without any transparency at all and instead have ugly black backgrounds.

So, does anyone know a solution to this problem?

like image 862
Scott Avatar asked Nov 13 '22 21:11

Scott


1 Answers

I believe the trouble is in the fact that you use BITMASK in a hardware accelerated environment.

I am not exactly clear about where the limitations are.

  • only VolatileImage? Or does it also apply to BITMASK BufferedImage instances?
  • does it apply to both the OpenGL and Direct3D pipelines? (not prudent to this thread; OpenGL is the only one available on Linux)

In any case the "solution" is to use BITMASK images only in software rendered environments; in hardware accelerated environments you need to use TRANSLUCENT images in stead. Its hard for me to find a valid source for my claim other than an older javagaming.org thread, so the only thing I can say is to try it out.

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

like image 190
Gimby Avatar answered Nov 16 '22 11:11

Gimby