Actualmente estamos desarrollando un juego en Java utilizando la API Java2D y está experimentando algunos problemas de rendimiento extrañas cuando se ejecuta en un entorno Ubuntu.Java2D: BufferedImage no aceleraron en Ubuntu
Nuestra velocidad de fotogramas cae de un promedio de 62fps en los sistemas Windows y Mac a alrededor de 10 fps en Ubuntu. Después de algunas horas de depuración y pruebas diversas banderas de JVM parece ser que BufferedImages utilizando una máscara de bits no están siendo aceleradas bajo Ubuntu porque
System.out.println(img.getCapabilities(config).isAccelerated());
imprime falsa.
Actualmente estamos cargando nuestras imágenes a través de
img = ImageIO.read(url);
y luego creando un BufferedImage compatibles dispositivo mediante el siguiente método:
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;
}
Al crear BufferedImages compatibles con el Transparency.OPAQUE, bandera del La primera línea del código de arriba imprime verdadero, lo que indica que la imagen ahora está acelerada y que la velocidad de cuadros parece volver a ser normal.
Sin embargo, esto no es por supuesto nuestra solución deseada ya que las imágenes se dibujen sin ninguna transparencia en absoluto y en lugar de tener fondos negros feos.
Así que, ¿alguien sabe una solución a este problema?
¿Está utilizando un controlador de vídeo en Ubuntu que soporta gráficos acelerados por hardware? – Jesper
Sí, estoy usando un controlador de video que admite la aceleración de hardware y, como se indicó anteriormente, el juego funciona bien si no hay transparencia involucrada. – Scott
Sugiero entrar en el código isAccelerated() y descubrir por qué es falso. – Gili