2011-06-09 15 views
5

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?

+0

¿Está utilizando un controlador de vídeo en Ubuntu que soporta gráficos acelerados por hardware? – Jesper

+0

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

+0

Sugiero entrar en el código isAccelerated() y descubrir por qué es falso. – Gili

Respuesta

1

creo que el problema está en el hecho de que utiliza BITMASK en un entorno de hardware acelerado.

No estoy exactamente claro dónde están los límites.

  • solamente VolatileImage? ¿O también se aplica a las instancias de BITMASK BufferedImage?
  • ¿se aplica a las tuberías de OpenGL y Direct3D? (No es prudente a este hilo; OpenGL es el único disponible en Linux)

En cualquier caso, la "solución" es el uso de imágenes de máscara de bits sólo en entornos de software prestados; en entornos acelerados por hardware, necesita usar imágenes TRANSLÚCIDAS en lugar. Es difícil para mí encontrar una fuente válida para mi reclamo que no sea un hilo antiguo de javagaming.org, así que lo único que puedo decir es que lo intente.

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