できるだけ早くとして透明BufferedImageをクリア
-
23-09-2019 - |
質問
私は、次のコード(私が思うに、それが作成されたかは関係ありません)で作成した透明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);
私はイメージを再作成することなく、最速の方法で画像(それが作成されたのと同じ状態で空の画像)可能性をクリアするにはどうすればよいですか? VMを一時停止し、UIを凍結、画像プットにGCの負担を再現ます。
解決
ガットそれ:)使用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());
他のヒント
一つの比較的高速な方法、それは最速だ場合、私は知らない(と私は他の答えを見てみたいと思いますが)あなたが変更しないことを別の画像を持つことである、それは常に/「完全に透明「完全にクリア」であります「そしてあなたは、ラスタのコピーを行い、CLEARをコピーし、あなたが名前の言うます:
imageYouWantToClear.setData( CLEAR.getRaster() );
ではない、非常に-よく文書行動が多いので、それがパフォーマンスに来るとき、グラフィックスでの作業は非常にトリッキーなことができることを注意を。たとえば、あなたのイメージ(CLEAR 1を言う)<全角> のかもしれない、ハードウェアアクセラレーションすることができますが、すぐに(のようなのSetRGBは言う(変異メソッドを使用したいようなハードウェア・アクセラレーション、その後失うだろう)の)、それはあなただけのハードウェアアクセラレーションの恩恵を失ったことを認識することが非常に困難証明する。
私はパフォーマンスのBufferedImageをテーマにに関する情報を見つける最適な場所は、JavaのゲームプログラマーとJavaゲーム-API-プログラマコミュニティ/フォーラムにあるであろうと思います。
ところで、あなたのBufferedImageの両方が「互換」モードを使用していることを確認してください:あなたは彼らのようなものをやって作成したいので、TYPE_INT_ARGBは、Windows上で罰金ではなく、などOS X、上のことがあります:
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
痛い法律・オブ・デメテルが痛い、感謝のJava;)