web-dev-qa-db-ja.com

Java2Dパフォーマンスの問題

Java2Dでパフォーマンスがおかしいのですが。 Sun.Java2d.opengl VMパラメータで2Dの3Dアクセラレーションを有効にすることは知っていますが、それを使用してもいくつかの奇妙な問題があります。

ここに私が実行したテストの結果があります:

JComponentに32x32ピクセルのタイルで25x18マップを描画する
画像1 = .bmp形式、画像2 = .png形式

-Dsun.Java2d.opengl = trueなし

.BMP画像を使用した120 FPS 1
。PNG画像2を使用した13 FPS

-Dsun.Java2d.opengl = true

.BMP画像を使用した12 FPS 1
。PNG画像2を使用した700 FPS

加速なしでは、ソフトウェアで行うすべてのdrawImage()で何らかの変換が行われ、.PNGの場合はFPSが大幅に低下すると想定しています。なぜ、アクセラレーションを使用すると、結果が切り替わるのですか(実際には、PNGは驚くほど高速に実行されます)。狂気!

.BMP画像1は、TYPE_INT_RGBの画像タイプに変換されます。 .PNG画像2は、TYPE_CUSTOMの画像タイプに変換されます。 openglアクセラレーションの有無にかかわらず速度を一定にするために、TYPE_INT_ARGBの画像タイプで新しいBufferedImageを作成し、この新しい画像に画像1または画像2を描画する必要があります。

これを実行した結果は次のとおりです。

-Dsun.Java2d.opengl = trueなし

.BMP画像を使用した120 FPS 1
。PNG画像2を使用した120 FPS

-Dsun.Java2d.opengl = true

.BMP画像を使用した700 FPS 1
。PNG画像2を使用した700 FPS

私の本当の質問は、TYPE_INT_ARGBがすべてのシステムとプラットフォームのネイティブイメージタイプであると想定できますか?この値は異なる可能性があると思います。最大のパフォーマンスを得るために常に新しいBufferedImagesを作成できるように、ネイティブ値を取得する方法はありますか?

前もって感謝します...

49
Consty

あまりにも多くのGoogle検索から細かい部分を調べてまとめることで解決策を見つけたと思います。

ここに、コメントとすべてがあります:

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; 
}

前回の投稿では、システムで最適化された画像を作成するために必要な情報を保持するのはGraphicsConfigurationでした。それはかなりうまくいくようですが、私はJavaが自動的にこれを行うでしょう。明らかに、Javaに慣れすぎることはできません。)と思っていたでしょう:)質問。まあ、うまくいけば、私が2次元ゲームにJava=.

58
Consty

Javaでグラフィックプログラミングを行うことを考えていたときに覚えていることから、組み込みライブラリは遅いです。私はGameDev.Netで、深刻なことをする人はだれでも jogl のようなものを使用する必要があるとアドバイスされました

1
Nick Stinemates