Java2D: BufferedImage pas accéléré sur Ubuntu

Nous développons actuellement un jeu en Java à l’aide de l’API Java2D et rencontrons des problèmes de performance étranges lors de son exécution dans un environnement Ubuntu.

Notre fréquence d’images passe de 62fps en moyenne sur les systèmes Windows et Mac à environ 10fps sur Ubuntu. Après quelques heures de débogage et de test de différents indicateurs JVM, il semble que les images Buffered utilisant un masque de bits ne soient pas accélérées sous Ubuntu car

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

imprime faux.

Actuellement, nous chargeons nos images via

 img = ImageIO.read(url); 

et créez ensuite un périphérique compatible BufferedImage en utilisant la méthode suivante:

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

Lors de la création de BufferedImages compatibles à l’aide de Transparency.OPAQUE, marquez la première ligne de code ci-dessus et affiche true, ce qui indique que l’image est maintenant accélérée et que la cadence semble être revenue à la normale.

Cependant, ce n’est évidemment pas notre solution souhaitée, car les images sont dessinées sans aucune transparence et ont plutôt un arrière-plan noir laid.

Alors, quelqu’un sait-il une solution à ce problème?

Je crois que le problème réside dans le fait que vous utilisez BITMASK dans un environnement accéléré par le matériel.

Je ne sais pas exactement où sont les limitations.

  • seulement VolatileImage? Ou s’applique-t-il également aux instances de BITMASK BufferedImage?
  • s’applique-t-il aux pipelines OpenGL et Direct3D? (pas prudent à ce sujet; OpenGL est le seul disponible sur Linux)

Dans tous les cas, la “solution” consiste à utiliser des images BITMASK uniquement dans des environnements rendus par logiciel; dans les environnements accélérés par le matériel, vous devez utiliser des images TRANSLUCENT à la place. Il est difficile pour moi de trouver une source valide pour ma revendication autre qu’un fil javagaming.org plus ancien. La seule chose que je puisse dire, c’est de l’essayer.

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