He estado estudiando las características de aceleración de hardware de Java, y todavía estoy un poco confundido ya que ninguno de los sitios que encontré en línea respondió claramente algunas de las preguntas que tengo. Así que aquí están las preguntas que tengo para la aceleración de hardware en Java:Java Hardware Acceleration
1) En Eclipse versión 3.6.0, con la actualización más reciente de Java para Mac OS X (creo que 1.6u10), ¿la aceleración de hardware está habilitada por defecto? He leído en alguna parte que
someCanvas.getGraphicsConfiguration().getBufferCapabilities().isPageFlipping()
se supone que dará una indicación de si es o no la aceleración de hardware está habilitado, y mis informes del programa posterior cierto cuando que se ejecuta en mi caso principal lienzo para dibujar a. Si mi aceleración de hardware no está habilitada ahora, o de manera predeterminada, ¿qué tendría que hacer para habilitarla?
2) He visto un par de artículos aquí y allá sobre la diferencia entre una Imagen Buffered y VolatileImage, principalmente diciendo que VolatileImage es la imagen acelerada por hardware y se almacena en VRAM para operaciones de copia rápida. Sin embargo, también encontré algunas instancias donde se dice que BufferedImage también está acelerado por hardware. ¿El hardware de BufferedImage también se acelera en mi entorno? ¿Cuál sería la ventaja de usar una imagen volátil si ambos tipos están acelerados por hardware? Mi principal supuesto para la ventaja de tener una imagen volátil en el caso de que ambos tengan aceleración es que VolatileImage es capaz de detectar cuándo se ha abandonado su VRAM. Pero si BufferedImage también es compatible con la aceleración ahora, ¿no tendría también el mismo tipo de detección incorporada, simplemente oculto para el usuario, en caso de que la memoria se descargue?
3) ¿Hay alguna ventaja de utilizar
someGraphicsConfiguration.getCompatibleImage/getCompatibleVolatileImage()
en contraposición a
ImageIO.read()
En un tutorial que he estado leyendo para algunos conceptos generales sobre la configuración de la ventana de renderizado correctamente (tutorial) usa el método getCompatibleImage, que creo que devuelve una imagen Buffered, para obtener sus imágenes "aceleradas por hardware" para el dibujo rápido, que se relaciona con la pregunta 2 acerca de si es hardware acelerado.
4) Esto es menos aceleración de hardware, pero es algo que me ha llamado la atención: ¿necesito pedir qué gráficos se dibujan? Sé que al usar OpenGL a través de C/C++ es mejor asegurarse de que se dibuje el mismo gráfico en todas las ubicaciones que necesita dibujar de una vez para reducir el número de veces que la textura actual necesita ser cambiada. Por lo que he leído, parece que Java se ocupará de esto para mí y se asegurará de que las cosas se dibujen de la manera más óptima, pero una vez más, nada ha dicho algo como esto claramente.
5) ¿Qué clases de AWT/Swing admiten la aceleración de hardware, y cuáles deberían usarse? Actualmente estoy usando una clase que amplía JFrame para crear una ventana y agregarle un lienzo desde el cual creo una estrategia BufferStrategy. ¿Es esta una buena práctica, o hay algún otro tipo de forma en que debería implementar esto?
Muchas gracias por su tiempo, y espero haberles proporcionado preguntas claras y suficiente información para poder responder a mis varias preguntas.
¿Hay alguna razón en particular por la que la mayoría de los ejemplos usen un JFrame para almacenar el lienzo? Por lo que entendí, Swing es bastante terrible. ¿Por qué no usarías un Marco? Tengo un código que hace exactamente eso, y parece que no es más difícil de crear que un JFrame. Además, ¿cómo se habilita la aceleración de hardware si no es por defecto? – Freezerburn
@FreezerBurn No sé por qué la mayoría de los ejemplos usan JFrame vs Frame. Me imagino que se hace con un JFrame porque eso es lo que se conoce más comúnmente. Esto es solo una especulación, pero supongo que la renderización manual en Java con solo un contenedor de nivel superior (JFrame, Frame, etc.) y un lienzo, hay poca diferencia entre cuál elegir. Para activar la aceleración de representación pase este arg (-Dsun.java2d.opengl = true) al iniciador de Java al iniciar el programa, o para configurarlo antes de usar cualquier biblioteca de renderizado. (System.setProperty ("sun.java2d.opengl", "true");) Es un parámetro opcional. – Zixradoom
JFrame es Swing donde Frame/Canvas es AWT. Swing es la biblioteca de componentes más nueva y AWT es la antigua biblioteca obsoleta. Swing utiliza componentes livianos donde AWT son componentes nativos. JFrame prefería los componentes AWT más antiguos. – chubbsondubs