2009-02-03 8 views
7

Mon application prend plusieurs secondes pour montrer la première fenêtre avec un Canvas3D dedans. J'ai profilé et constaté que le goulot d'étranglement est en SimpleUniverse.getPreferredConfiguration(); le premier appel prend trois ou quatre secondes, et doit être appelé avant que la scène puisse être rendue.Comment démarrer Java3D plus rapidement?

J'utilise le moteur de rendu Direct3D (-Dj3d.rend=d3d), car le moteur de rendu OpenGL se bloque sur ma carte graphique. J'ai une carte ATI intégrée exécutant un seul moniteur.

Répondre

12

La raison du ralentissement est que GraphicsDevice.getConfigurations(), qui est utilisé par SimpleUniverse.getPreferredConfiguration(), est très lent sur certains systèmes. Voir this java.net forum thread, qui relie à this Java3D bug, qui dans les liaisons tour à this Sun bug:

Le problème est que ::DescribePixelFormat appel Win32 est lent - prend jusqu'à 60 ms pour terminer. ...
Avec la solution de contournement suggérée (qui elminats [sic] les appels win32 incriminés) le temps est considérablement amélioré (à, comme, 0ms).

La solution mentionnée est de passe -Dsun.awt.nopixfmt=true à la machine virtuelle Java, ce qui rend le code natif sous-jacent n'appeler DescribePixelFormat.

Ceci est apparemment pas une solution parfaite:

... quelques applications qui utilisent OpenGL avec Java peut ne pas fonctionner correctement.

Mais puisque j'utilisais Direct3D de toute façon, ce n'est pas un problème. Cela réduit de 3,2 secondes le temps de démarrage.

+0

Je viens de trouver cette solution de contournement hier, alors je fais un enregistrement public pour ne pas le perdre à nouveau. –

+0

Comment passer -Dsun.awt.nopixfmt = true en jvm? ou Comment arrêter d'appeler l'objet Configuration graphique dans java3D? – Jay

Questions connexes