12

次のコードで作成された透過的なBufferedImageがあります(作成方法とは関係ありません):

            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice gs = ge.getDefaultScreenDevice();
            GraphicsConfiguration gc = gs.getDefaultConfiguration();

            Rectangle screen = transformationContext.getScreen();

            // Create an image that supports transparent pixels
            return gc.createCompatibleImage((int) screen.getWidth(), (int) screen.getHeight(),
                    Transparency.BITMASK);

イメージを再作成せずに、可能な限り最速の方法でイメージ(作成されたのと同じ状態の空のイメージ)をクリアするにはどうすればよいですか?イメージを再作成すると、GCに負担がかかり、VMが一時停止し、UIがフリーズします。

4

2 に答える 2

20

了解しました:)透明色で塗りつぶす代わりにclearRectを使用しました。

            graphics = (Graphics2D) offlineBuffer.getGraphics();
            graphics.setBackground(new Color(255, 255, 255, 0));
            Rectangle screen = transformationContext.getScreen();
            graphics.clearRect(0,0, (int)screen.getWidth(), (int)screen.getHeight());
于 2010-03-02T22:55:45.257 に答える
9

比較的速い方法の1つですが、それが最速かどうかはわかりません(そして、他の答えを見たいのですが)、変更することのない別の画像を作成し、それを常に「完全にクリア」/「完全に透明」にしてからラスターコピーを実行し、そのコピーにCLEARという名前を付けたとします。

imageYouWantToClear.setData( CLEAR.getRaster() );

十分に文書化されていない動作が多数あるため、パフォーマンスに関しては、グラフィックの操作が非常に難しい場合があることに注意してください。たとえば、画像(CLEARなど)はハードウェアアクセラレーションである可能性がありますが、ミューテーションメソッド(たとえばsetRgb() )を使用するとすぐにハードウェアアクセラレーションが失われ、実現が非常に困難になります。ハードウェアアクセラレーションのメリットを失っただけです。

パフォーマンスの高いBufferedImageに関する情報を見つけるのに最適な場所は、JavaゲームプログラマーとJavaゲームAPIプログラマーのコミュニティ/フォーラムだと思います。

ところで、両方のBufferedImageが「互換」モードを使用していることを確認してください。TYPE_INT_ARGBはWindowsでは問題ないかもしれませんが、OS Xなどでは問題ないので、次のように作成します。

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);

デメテルの法則が痛い、Javaに感謝;)

于 2010-03-02T22:50:53.963 に答える