12
votes

Comment créer une image accélérée du matériel avec Java2D?

J'essaie de créer un générateur d'image rapide qui fait beaucoup de transformations 2D et de rendu de forme 2D, j'essaie donc d'utiliser un bufferedimage, puis d'acquérir l'objet graphique2D pour effectuer tout mon dessin. Ma principale préoccupation est maintenant de faire est vraiment rapide, donc je crée une bufferedimage comme ceci: xxx

Toutefois si je le fais: xxx

La sortie est toujours false , même si je démarre le jvm avec -dsun.java2d.opengl = true qui imprime la ligne: xxx

i 'm faisant une bufferedimage car à la fin je veux l'enregistrer dans un fichier png avec imageio.write (bimage, "png", fichier);

Je peux créer un volatilage qui dira que c'est accéléré mais Imageo n'aime pas le cas lors de la tentative de sauvegarde, affirmant que cette image ne peut pas être couplée à renduImage. Des idées sur la manière d'obtenir une image accélérée pouvant être stockée sur le disque? De plus, je ne veux pas créer de volatilage et de copie sur une bufferedimage pour économiser depuis mes images sont vraiment grandes et je vais courir dans des problèmes de mémoire ...


3 commentaires

Quelle version de Java utilisez-vous?


J'utilise Java6 avec le Sun JDk


Puis-je vous suggérer de mettre en œuvre le code, puis une fois que le code est en place? De cette façon, vous travaillez s'il y a suffisamment de ralentissement pour justifier d'essayer de l'accélérer.


3 Réponses :


1
votes

Essayez d'ajouter ceci à votre ligne de commande:

-Dsun.java2d.opengl=true


3 commentaires

Ajouter ce paramètre, malheureusement ne change rien.


Être minuscule n'a aucun impact. De la documentation, un vrai majuscule a permis au pipeline OpenGL avec des informations de débogage par exemple. Il imprime: OpenGL Pipeline activé pour la configuration par défaut à l'écran 0, avec minuscule, il s'agit du même comportement, mais sans les informations de débogage étant imprimées.


Je suis juste allé et je suis googlé quelques docs à ce sujet et c'est ce qu'ils ont dit. Je suppose que la leçon a appris pour essayer d'aider à quelque chose que vous ne connaissez pas.



0
votes

Voici comment cela fonctionne:

La manière dont vous créez l'image est correcte. Mais Java n'accélère pas l'image tout de suite. Il existe un seuil d'appels de rendu qui doivent être dirigés à votre image après quoi l'image sera accélérée. Mais si vous définissez le suivant, xxx

Votre image doit être accélérée au moment où vous le créez.

Vous devez toujours utiliser l'image en quelque sorte pour il est accéléré. Par exemple, j'ai la pièce de code suivante utilisée pour copier une image chargée (le chargement via Imageo vous donnera une image qui ne peut pas être accélérée) dans mon nouveau bufferedimage. xxx < p> Avant ce segment de code, le bufferedimage n'est pas accéléré, c'est ensuite.

mais méfiez-vous, si vous manipulez directement les données d'image (c.-à-d. Non via Java-2D) votre image ne sera plus mise en cache dans VRAM et vous devez la copier à une nouvelle image gérée afin de retrouver votre accélération.


0 commentaires

6
votes

De mon enquête et lecture du tutoriel 2D Sun / Oracle 2D C'est ce que j'ai trouvé:

Pour créer une image accélérée, on peut utiliser l'image volatile, créée comme PBuffer. Il y a des avantages et des inconvénients, les volatilages sont rapides jusqu'à ce que vous essayiez d'obtenir les données de pixels raster. À ce moment-là, ils deviennent un tampon normal. En outre, ils sont volatils et il n'ya aucune garantie qu'il sera disponible à la fin de votre rendu. Pour ce faire, vous exécutez: P>

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage img = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
img.setAccelerationPriority(1);


0 commentaires