2009-02-03 14 views
7

Mi aplicación tarda varios segundos en mostrar la primera ventana con un Canvas3D en ella. Lo he perfilado y he descubierto que el cuello de botella está en SimpleUniverse.getPreferredConfiguration(); la primera llamada lleva tres o cuatro segundos, y se debe llamar a antes de que se pueda representar la escena.¿Cómo puedo hacer que Java3D comience más rápido?

Estoy usando el renderizador Direct3D (-Dj3d.rend=d3d), porque el renderizador OpenGL se cuelga en mi tarjeta gráfica. Tengo una tarjeta integrada ATI con un solo monitor.

Respuesta

12

El motivo de la ralentización es que GraphicsDevice.getConfigurations(), que es utilizado por SimpleUniverse.getPreferredConfiguration(), es muy lento en algunos sistemas. Ver this java.net forum thread, que enlaza con this Java3D bug, que a su vez enlaces a this Sun bug:

El problema es que ::DescribePixelFormat Win32 llamada es lento - toma hasta 60 ms para completar. ...
Con la solución sugerida (que elmina [sic] las llamadas win32 infractoras) el tiempo se ha mejorado significativamente (a, como, 0 ms).

La solución mencionada es pase -Dsun.awt.nopixfmt=true a la JVM, lo que hace que el código nativo subyacente no llama DescribePixelFormat.

Al parecer, esto no es una solución perfecta:

... algunos aplicaciones que utilizan OpenGL con Java no funcionen correctamente.

Pero ya que estaba usando Direct3D de todos modos, no es un problema. Esto cortó 3.2 segundos de tiempo de inicio.

+0

Acabo de encontrar esta solución ayer, por lo que estoy haciendo un registro público para no perderlo de nuevo. –

+0

Cómo pasar -Dsun.awt.nopixfmt = true to jvm? o ¿Cómo dejar de llamar al objeto de configuración de gráficos en java3D? – Jay

Cuestiones relacionadas