Java Accélération Matérielle

j'ai passé un certain temps à regarder les fonctionnalités d'accélération matérielle de Java, et je suis encore un peu confus car aucun des sites que j'ai trouvé en ligne directement et clairement répondu à certaines des questions que j'ai. Voici donc les questions que j'ai pour l'accélération matérielle en Java:

1) dans la version 3.6.0 D'Eclipse, avec la mise à jour Java la plus récente pour Mac OS X (1.6u10 I think), is hardware acceleration enabled by default? J'ai lu quelque part que

someCanvas.getGraphicsConfiguration().getBufferCapabilities().isPageFlipping()

est censé indiquer si l'accélération matérielle est activée ou non, et mon programme renvoie true lorsque cela est exécuté sur mon instance principale de Canvas pour dessiner. Si mon accélération matérielle n'est pas activé dès maintenant, ou par défaut, qu'aurais-je à faire pour l'activer?

2) j'ai vu quelques articles ici et là sur la différence entre un BufferedImage et VolatileImage, disant principalement que VolatileImage est le matériel accéléré image et est stocké dans VRAM pour la copie rapide - des opérations. Cependant, j'ai aussi trouvé des cas où BufferedImage est considéré comme du matériel accéléré. Est BufferedImage accélération matérielle aussi bien dans mon environnement? Quel serait l'avantage d'utiliser une image volatile si les deux types sont accélérés? Mon hypothèse principale pour l'avantage d'avoir un VolatileImage dans le cas des deux ayant une accélération est que VolatileImage est capable de détecter lorsque son VRAM a été jeté. Mais si BufferedImage supporte aussi l'accélération maintenant, n'aurait-il pas le même type de détection intégrée, juste cachée à l'utilisateur, au cas où la mémoire serait déchargée?

3) y a-t-il un avantage à utiliser

someGraphicsConfiguration.getCompatibleImage/getCompatibleVolatileImage()

plutôt pour

ImageIO.read()

dans un tutoriel que j'ai lu pour quelques concepts généraux sur la mise en place correcte de la fenêtre de rendu (tutoriel) il utilise la méthode getCompatibleImage, ce que je crois renvoie un BufferedImage, pour obtenir leurs images "hardware accelerated" pour le dessin rapide, qui se rattache à la question 2 de savoir si c'est hardware accelerated.

4) c'est moins d'accélération matérielle, mais c'est quelque chose qui m'a intrigué: dois-je commander quels graphismes sont dessinés? Je sais que lors de L'utilisation D'OpenGL via C/C++ il est préférable de s'assurer que le même graphique est dessiné dans tous les endroits où il doit être dessiné à la fois pour réduire le nombre de fois où la texture actuelle a besoin à l'interrupteur. D'après ce que j'ai lu, il semble que Java va s'occuper de cela pour moi et s'assurer que les choses sont tirées de la façon la plus optimale, mais encore une fois, rien n'a jamais dit quelque chose comme ça clairement.

5) quelles classes AWT/Swing prennent en charge l'accélération matérielle, et lesquelles devraient être utilisées? J'utilise actuellement une classe qui étend JFrame pour créer une fenêtre, et y ajoute une Canvas à partir de laquelle je crée une stratégie buffers. Est-ce une bonne pratique, ou est-il un autre type de de la façon dont je devrais mettre en œuvre ça?

Merci beaucoup pour votre temps, et j'espère que j'ai fourni des questions claires et assez d'information pour vous permettre de répondre à mes plusieurs questions.

17
demandé sur Zixradoom 2011-01-07 18:48:28

2 réponses

1) La mesure de l'accélération matérielle n'est jamais activé par défaut, et à ma connaissance il n'a pas encore changé. Pour activer le rendu de l'accélération passez cet arg (- Dsun.java2d.opengl=true) au lanceur Java au démarrage du programme, ou le configurer avant d'utiliser toute bibliothèque de rendu. System.setProperty("sun.java2d.opengl", "true"); C'est un paramètre facultatif.

2) Oui BufferedImage encapsule certains détails de la gestion de la mémoire Volatile parce que, lorsque le BufferdImage est accéléré une copie est conservée en V-Ram comme un VolatileImage.

La tête à la une BufferedImage est aussi longtemps que vous ne jouez pas avec les pixels qu'il contient, simplement les copier comme un appel à graphics.drawImage(), puis BufferedImage sera accéléré après un certain nombre non spécifié de copies et il gérera le VolatileImage pour vous.

L'inconvénient d'une BufferedImage si vous faites du retouche d'image, changez les pixels dans le BufferedImage, dans certains cas, il va essayer d'accélérer, à ce stade, si vous êtes à la recherche pour Rendu performant pour votre édition, vous devez envisager de gérer votre propre VolatileImage. Je ne sais pas les opérations qui font l' BufferedImage renoncez à essayer d'accélérer le rendu pour vous.

3) L'avantage de l'utilisation de l' createCompatibleImage()/createCompatibleVolatileImage() c'est que ImageIO.read() ne fait aucune conversion vers un modèle de données D'Image pris en charge par défaut. Ainsi, si vous importez un PNG, il le représentera dans le format construit par le lecteur PNG. Cela signifie que chaque fois qu'il est rendu par un GraphicsDevice il doit d'abord être converti à un modèle de données D'Image compatible.

BufferedImage image = ImageIO.read ( url );
BufferedImage convertedImage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
GraphicsDevice gd = ge.getDefaultScreenDevice ();
GraphicsConfiguration gc = gd.getDefaultConfiguration ();
convertedImage = gc.createCompatibleImage (image.getWidth (), 
                                           image.getHeight (), 
                                           image.getTransparency () );
Graphics2D g2d = convertedImage.createGraphics ();
g2d.drawImage ( image, 0, 0, image.getWidth (), image.getHeight (), null );
g2d.dispose()

le processus ci-dessus convertira une image lue avec l'api io d'image en un BufferedImage qui a un modèle de données D'Image compatible avec le dispositif d'écran par défaut de sorte que la conversion n'a pas besoin d'avoir lieu quand jamais il est rendu. Les moments où cela est le plus avantageux est quand vous rendrez l'image très fréquemment.

4) Vous n'avez pas besoin de faire un effort de fournée votre Rendu d'image parce que pour le la plupart du temps, Java tentera de le faire pour vous. Il n'y a pas de raison pour que vous n'essayiez pas de le faire, mais en général, il est préférable de profiler vos applications et de confirmer qu'il y a un goulot d'étranglement dans le code de rendu d'image avant de tenter d'effectuer une optimisation des performances comme celle-ci. Le principal inconvénient est qu'il peut être mis en œuvre un peu différemment dans chaque JVM et que les améliorations peuvent alors être sans valeur.

5) À ma connaissance, le design que vous avez outlined est l'une des meilleures stratégies là-bas quand faire double tampon manuellement et activement rendre une application. http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferStrategy.html Sur ce lien, vous trouverez une description de l' BufferStrategy. Dans la description il y a un extrait de code qui est la façon recommandée de faire un rendu actif avec un BufferStrategy objet. J'utilise cette technique particulière pour mon code de rendu actif. La seule différence majeure est que dans mon code. comme vous, j'ai créé l' BufferStrategy sur une instance d'un Canvas que j'ai mis sur un JFrame.

16
répondu Zixradoom 2014-10-01 12:31:47

à en juger par certains plus âgés de la documentation, vous pouvez dire sur Sun JVMs si l'accélération matérielle est activée ou non en cochant le sun.java2d.opengl propriété.

vous pouvez vérifier si une image individuelle est hardware accelerated en utilisant ImagegetCapabilities(GraphicsConfiguration).isAccelerated()

Ayant dit tout cela, toute la documentation que j'ai vu (y compris celui-ci) implique que les BufferedImage l'accélération matérielle. Swing a également été modifié pour utiliser VolatileImages pour son double-buffering pour cette raison.

2
répondu Powerlord 2015-11-30 20:28:16