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?
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With