web-dev-qa-db-fra.com

Java2D Performance Problèmes

J'ai des bizarreries de performance avec Java2D. Je connais du soleil.java2d.opengl VM Paramètre pour activer l'accélération 3D pour 2D, mais même l'utiliser qui a des problèmes étranges.

Voici les résultats des tests que j'ai couru:

Dessinez une carte 25x18 avec des carreaux de pixels 32x32 sur un jcommonent
image 1 = format .bmp, image 2 = format .png

Sans -dsun.java2d.opengl = true

120 FPS utilisant .BMP image 1
[.____] 13 FPS en utilisant l'image .png 2

Avec -dsun.java2d.opengl = true

12 FPS utilisant .BMP image 1
[.____] 700 fps en utilisant l'image .png 2

Sans accélération, je suppose qu'une sorte de transformation se déroule avec chaque drawimage () que je fais dans des logiciels et qui retire considérablement le FPS dans le cas de .png. Pourquoi, avec accélération, le commutateur des résultats (et PNG effectue-t-il réellement une incroyablement plus rapide) ?! Folie!

.BMP image 1 est traduit en un type d'image de type_int_rgb. L'image .png 2 est traduite en un type d'image de type_custom. Afin d'obtenir une vitesse cohérente avec et sans accélération OpenGL, je dois créer une nouvelle buffleDimage avec un type d'image de type_int_argb et dessiner image 1 ou image 2 sur cette nouvelle image.

Voici les résultats en cours d'exécution avec cela:

Sans -dsun.java2d.opengl = true

120 FPS utilisant .BMP image 1
120 FPS en utilisant l'image .png 2

Avec -dsun.java2d.opengl = true

700 FPS utilisant .BMP image 1
[.____] 700 fps en utilisant l'image .png 2

Ma vraie question est que puis-je supposer que type_int_argb sera le type d'image natif de tous les systèmes et plates-formes? Je suppose que cette valeur pourrait être différente. Y a-t-il un moyen pour moi d'obtenir la valeur native afin de pouvoir toujours créer de nouveaux bufferedimages pour une performance maximale?

Merci d'avance...

49
Consty

Je pense avoir trouvé une solution en recherchant et en mettant des morceaux et des morceaux de trop de recherches Google.

Voici les commentaires et tous:

private BufferedImage toCompatibleImage(BufferedImage image)
{
    // obtain the current system graphical settings
    GraphicsConfiguration gfxConfig = GraphicsEnvironment.
        getLocalGraphicsEnvironment().getDefaultScreenDevice().
        getDefaultConfiguration();

    /*
     * if image is already compatible and optimized for current system 
     * settings, simply return it
     */
    if (image.getColorModel().equals(gfxConfig.getColorModel()))
        return image;

    // image is not optimized, so create a new image that is
    BufferedImage newImage = gfxConfig.createCompatibleImage(
            image.getWidth(), image.getHeight(), image.getTransparency());

    // get the graphics context of the new image to draw the old image on
    Graphics2D g2d = newImage.createGraphics();

    // actually draw the image and dispose of context no longer needed
    g2d.drawImage(image, 0, 0, null);
    g2d.dispose();

    // return the new optimized image
    return newImage; 
}

Dans mon précédent post, GraphicsConfiguration était ce qui a contenu les informations nécessaires à la création d'images optimisées sur un système. Il semble fonctionner assez bien, mais j'aurais pensé Java= le ferait automatiquement pour vous. Évidemment, vous ne pouvez pas être trop à l'aise avec Java. :) Je suppose que j'ai fini par répondre à mon propre question. Oh bien, j'espère que cela aidera certains d'entre vous que j'ai vu essayer d'utiliser Java pour les jeux 2D.

58
Consty

D'après ce que je me souviens quand je pensais faire de la programmation graphique en Java, les bibliothèques intégrées sont lentes. J'ai été conseillé à Gamedev.net que quiconque faisait quelque chose de sérieux devrait utiliser quelque chose comme Jogl

1
Nick Stinemates