J'ai des problèmes de performance avec Java2D. Je connais le paramètre sun.java2d.opengl VM qui permet d'activer l'accélération 3D pour la 2D, mais même en l'utilisant, je rencontre des problèmes bizarres.
Voici les résultats des tests que j'ai effectués :
Dessiner une carte de 25x18 avec des tuiles de 32x32 pixels sur un JComponent
Image 1 = format .bmp, Image 2 = format .png
Sans -Dsun.java2d.opengl=true
120 FPS en utilisant l'image .BMP 1
13 FPS en utilisant l'image .PNG 2
Avec -Dsun.java2d.opengl=true
12 FPS en utilisant l'image .BMP 1
700 FPS en utilisant l'image .PNG 2
Sans accélération, je suppose qu'une sorte de transformation a lieu à chaque fois que je fais un drawImage() dans le logiciel, et que cela réduit considérablement le nombre de FPS dans le cas du .PNG. Mais pourquoi, avec l'accélération, les résultats changeraient-ils (et le PNG est en fait incroyablement plus rapide) ? ! C'est de la folie !
L'image .BMP 1 est convertie en un type d'image de TYPE_INT_RGB. L'image .PNG 2 est convertie en un type d'image de TYPE_CUSTOM. Afin d'obtenir une vitesse constante avec et sans accélération opengl, je dois créer une nouvelle BufferedImage avec un type d'image TYPE_INT_ARGB, et dessiner l'image 1 ou l'image 2 dans cette nouvelle image.
Voici les résultats obtenus avec cette méthode :
Sans -Dsun.java2d.opengl=true
120 FPS en utilisant l'image .BMP 1
120 FPS en utilisant l'image .PNG 2
Avec -Dsun.java2d.opengl=true
700 FPS en utilisant l'image .BMP 1
700 FPS en utilisant l'image .PNG 2
Ma vraie question est la suivante : puis-je supposer que TYPE_INT_ARGB sera le type d'image natif pour tous les systèmes et toutes les plateformes ? Je suppose que cette valeur pourrait être différente. Existe-t-il un moyen pour moi d'obtenir la valeur native afin de pouvoir toujours créer de nouvelles BufferedImages pour des performances maximales ?
Merci d'avance...