モジュール java.desktop
パッケージ java.awt.image

クラスVolatileImage

java.lang.Object
java.awt.Image
java.awt.image.VolatileImage
すべての実装されたインタフェース:
Transparency

public abstract class VolatileImage extends Image implements Transparency
VolatileImageは、アプリケーションが制御できない状況(オペレーティング・システムや別のアプリケーションが原因の状況など)でいつでも内容を破棄できるイメージです。 一部のプラットフォームでは、ハードウェア・アクセラレーションを利用できる可能性があるため、VolatileImageオブジェクトの利用でパフォーマンスが大幅に向上します。

イメージの描画表面(イメージの内容が実際に常駐するメモリー領域)は、そのメモリーの内容が他に移動することによって失われるか、無効化される可能性があります。 したがって描画表面を復元または再生成し、その描画表面の内容を再描画する必要があります。 VolatileImageはこれらの問題が発生した時にこれを検出し、修正するためのインタフェースを提供します。

VolatileImageオブジェクトが生成される時には、イメージ・サポートのため、ビデオ・メモリー(VRAM)などの制限されたシステム・リソースが割り当てられます。 VolatileImageオブジェクトが使用されなくなった場合にはガベージ・コレクトされ、割り当てられたシステム・リソースが解放されますが、このプロセスの実行タイミングは一定ではありません。 たとえばウィンドウ・サイズを変更すると、変更のたびにバック・バッファが再生成されますが、このように多数のVolatileImageオブジェクトを生成するアプリケーションでは、使用されなくなったオブジェクトがシステム上に残っているという理由だけで、新しいVolatileImageオブジェクトの生成に最適なリソースが不足する可能性があります。 この場合、新しいVolatileImageオブジェクトが生成されても、高速なメモリーに生成された場合に比べてパフォーマンスは低下します。 flushメソッドはいつでも呼び出して、VolatileImageで使用されるリソースを事前に解放し、以後のVolatileImageオブジェクトの高速化を妨げないようにすることができます。 この方法では、無効になったVolatileImageオブジェクトに占有されているリソースの状態をアプリケーションから制御しやすくなります。

このイメージは直接サブクラス化せず、Component.createVolatileImageまたはGraphicsConfiguration.createCompatibleVolatileImage(int, int)メソッドを使用して作成するようにしてください。

次にVolatileImageオブジェクトの例を示します。

 // image creation
 VolatileImage vImg = createVolatileImage(w, h);


 // rendering to the image
 void renderOffscreen() {
      do {
          if (vImg.validate(getGraphicsConfiguration()) ==
              VolatileImage.IMAGE_INCOMPATIBLE)
          {
              // old vImg doesn't work with new GraphicsConfig; re-create it
              vImg = createVolatileImage(w, h);
          }
          Graphics2D g = vImg.createGraphics();
          //
          // miscellaneous rendering commands...
          //
          g.dispose();
      } while (vImg.contentsLost());
 }


 // copying from the image (here, gScreen is the Graphics
 // object for the onscreen window)
 do {
      int returnCode = vImg.validate(getGraphicsConfiguration());
      if (returnCode == VolatileImage.IMAGE_RESTORED) {
          // Contents need to be restored
          renderOffscreen();      // restore contents
      } else if (returnCode == VolatileImage.IMAGE_INCOMPATIBLE) {
          // old vImg doesn't work with new GraphicsConfig; re-create it
          vImg = createVolatileImage(w, h);
          renderOffscreen();
      }
      gScreen.drawImage(vImg, 0, 0, this);
 } while (vImg.contentsLost());
 

情報は潜在的なImageProducerから得られるため、このクラスは、非同期通知にImageObserverパラメータを使用するメソッドを含むImageクラスからサブクラス化されます。 このVolatileImageは非同期ソースからロードされないので、ImageObserverパラメータを持つ複数のメソッドが、データがImageProducerから取得済みであるかのように動作します。 ここで重要なことは、このようなメソッドからの戻り値を確認しても、情報が有効かどうかは判断できないということです。したがって、これらのメソッドで使用されているImageObserverを、非同期コールバック通知のために記録する必要はありません。

導入されたバージョン:
1.4