Java

Java 2D テクノロジ
のシステムプロパティ

ドキュメントの目次

このドキュメントでは、2D ペインティングシステムの動作方法をカスタマイズするために使用する、サポートされていないプロパティについて説明します。これらのプロパティは、パフォーマンスの向上、不適切な描画の修正、または特定の構成下でのシステムクラッシュの回避を目的として使用されることもあります。たとえば、不良な DirectDraw または Direct3D ドライバを搭載した Microsoft Windows コンピュータの小規模なセットでハードウェア高速化描画を使用すると、システムクラッシュが発生する可能性があります。このような場合は、2D プロパティを使って、それらのコンピュータで Java 2D システムが DirectDraw または Direct3D を使用しないように指定できます。


警告: これらのプロパティを使用するときは注意が必要です。プロパティの中には、実用的な理由でサポートされないものがいくつかあります。たとえば、ドライバが不安定なためにデフォルトでいくつかの動作が無効になっている場合、このような動作を有効にすると、一部の構成でシステムが不安定になることがあります。

これらのプロパティは、実装に固有の動作を有効にしたり無効にしたりすることを唯一の目的としているため、通知なしに変更または廃止されることがあります。また、一部のプロパティは、ドキュメントに記載された特定の製品リリースでしか動作しないこともあります。

2D プロパティには、接頭辞 sun.java2d. が付きます。2D プロパティを指定する場合は、コマンド行フラグを使用することも、_JAVA_OPTIONS 環境変数を使用することもできます。たとえば次のように、アプリケーションの実行時に 2D trace プロパティを指定できます。

java -Dsun.java2d.trace=log SomeApp
あるいは次のように、アプリケーションの実行前に _JAVA_OPTIONS を設定してプロパティを指定することもできます。
export _JAVA_OPTIONS='-Dsun.java2d.trace=log' (UNIX の bash シェル)
java SomeApp

一部のシステムプロパティは、環境変数を使っても設定できます。たとえば、d3d プロパティには同等の環境変数 J2D_D3D があります。プロパティの説明では、同等の環境変数がある場合はそれも示します。


注: プロパティの説明で使用される用語については、「High Performance Graphics」ホワイトペーパーを参照してください。

このドキュメントでは、次のプロパティについて説明します。


すべてのプラットフォームに共通のシステムプロパティ

opengl

使用目的: OpenGL ベースのパイプラインを有効にして、ハードウェアの高速化を図ります。
導入されたシステム: J2SE 5.0 Beta 1 (Solaris/Linux)、J2SE 5.0 Beta 2 (Microsoft Windows)
デフォルト値:false
使用方法:OpenGL ベースのパイプラインを通知なしで有効にするには、このプロパティを true に設定します。

        -Dsun.java2d.opengl=true

OpenGL ベースのパイプラインが特定のスクリーンに対して正常に初期化されたかどうかに関する、コンソールへの詳細な出力を行うには、大文字の「T」を使用して、このプロパティを True に設定します。

-Dsun.java2d.opengl=True 

Java 2D 用の OpenGL ベースのパイプラインは、Solaris/Linux プラットフォームの J2SE 5.0 Beta 1 と Microsoft Windows プラットフォームの J2SE 5.0 Beta 2 に導入されました。現時点では、このパイプラインはデフォルトで無効になっています。このパイプラインにより、テキスト、イメージ、ライン、塗りつぶしのプリミティブなどの単純な描画操作だけでなく、複雑な変換、ペイント、合成およびクリッピングなどの操作にもハードウェアの高速化が適用されます。

関連情報 Java 2 Platform Standard Edition 5.0 の Java 2D の新機能OpenGL に関する節


trace

使用目的: グラフィックス性能を低めにした方がよい原因を調べます。
導入されたシステム: 1.4
使用方法:アプリケーションの性能を低めにした方がよい場合は、trace 実行時フラグを使用してその問題の原因を調べることができます。このフラグには、いくつかのオプションを指定できます。

    -Dsun.java2d.trace=[log[,timestamp]],[count],[out:<filename>],[help],[verbose]

オプションを以下に示します。

log
各プリミティブが実行されたときにその名前を出力する
timestamp
各ログエントリの前に currentTimeMillis() を付ける
count
終了時に、使用された各プリミティブの総数を出力する
out:<filename>
出力 (ログや総数) を指定されたファイルに送信する
help
使用方法に関する簡単な説明を出力する
verbose
この実行用に選択されたオプションの概要を出力する

log オプションを使用すると、Java 実行環境によって、実行されたプリミティブの名前がたいてい次の形式で出力されます。

    <classname>.<methodname>(<src>,<composite>,<dst>)

methodname は、Graphics メソッド呼び出しの実際の描画作業に使用される基本的なグラフィックス操作を表します。これらのメソッド名が必ずしも Graphics オブジェクトに対するメソッドに直接マップされるとは限りません。同様に、Graphics オブジェクトに対して行われた呼び出しの数が実行されたプリミティブの操作の数に直接マップされるとは限りません。

srcdst は、操作に関係する表面またはソースデータのタイプを表します。

composite 名は、AlphaComposite クラスに含まれる名前に接尾辞「NoEa」を付けたものと正確に一致し、AlphaComposite インスタンスに「特別なアルファ」属性 1.0 が設定されていることを意味します。「SrcNoEa」タイプは最もよく使われる合成タイプであり、混合を必要としない最も簡単なピクセルの転送方法を表します。不透明な色やイメージが描画されるときは、デフォルトの合成が「SrcOver」であっても、内部では「SrcNoEa」が頻繁に使用されます。これは、不透明なソースピクセルの場合は、それらの 2 つの操作の見分けがつかないためです。

プラットフォームの描画パイプラインは、X11、GDI、DirectDraw などのプラットフォームの描画プログラムがアクセスできる表面に対して不透明な操作を行うために使用されることがあります。現在のところ、それらの名前は、簡略化された名前付け形式に従って、プラットフォームの描画プログラムを表す接頭辞と操作の名称から構成され、クラス名やオペランドタイプのリストは含みません。たとえば、「X11DrawLine」、「GDIFillOval」、「DXFillRect」となります。今後は、これらの名前は他のプリミティブの名前と非常によく似たものになる予定です。


Microsoft Windows プラットフォームのシステムプロパティ

accthreshold

使用目的: VRAM バージョンのイメージが自動的に作成される前に、管理されるイメージから行われるコピー数を指定します。
導入されたシステム: 1.4.1_02
デフォルト値:1
使用方法: イメージの初期化中に高速化処理された表面を強制的に作成するには、次のように、この値を 0 に設定します。

-Dsun.java2d.accthreshold=0

このプロパティを使用すると、最初にいくつかのコピーが行われたあとで、イメージが VRAM にコピーされているときに、描画の初期遅延を解消することができます。初期遅延は、事実上イメージ作成時間へシフトされます。

この動作は、アプリケーションがイメージ管理をうまく利用できること、つまり、開始早々速度の遅いコピー処理にわずらわされ、あとになってコピーのオーバーヘッドを負うのではなく、開始時にコピーのオーバーヘッドを片付けられることがわかっている場合には有効です。


d3d

使用目的: Java 2D システムによる Direct3D の使用をオフにします。
導入されたシステム: 1.4.1_02
同等の環境変数: J2D_D3D
使用方法: バグのある Direct3D ドライバを搭載した Windows 2000 システム の小規模なサブセットで Direct3D を使用すると、システムクラッシュが発生することがあります。Direct3D の使用をオフにするには、このプロパティを false に設定します。
-Dsun.java2d.d3d=false
引き続き問題が発生している場合は、ddoffscreen プロパティを false に設定してみてください。それでも問題が解決されない場合は、noddraw を true に設定してみてください。

d3dtexbpp

使用目的: 管理されるイメージまたは半透明のイメージの高速化処理された表面の形式を 16 ビット (4444) にすることを指定します。これにより、VRAM とシステムメモリを保存できますが、品質は低下します。
導入されたシステム: 1.4.1_02
デフォルト値: 32
使用方法: 4444 形式をオンにするには、このプロパティを 16 に設定します。

-Dsun.java2d.d3dtexbpp=16

注: OpenGL パイプラインを使用している場合、d3dtexbpp プロパティは効果がありません。

このプロパティを 16 に設定すると、管理されるイメージ (GraphicsConfiguration.createCompatibleImage(w,h, TRANSLUCENT) で作成されたイメージ) または Toolkit.getImage でロードされた半透明なイメージの高速化処理された表面の形式が強制的に 4444 になります。同様に、これらのイメージのシステムメモリ表面も 4444 形式になります。

このオプションは、多数のイメージを VRAM に保存する場合に有効です。ただし、品質は劣化します。

このオプションは、32 ビットのテクスチャをサポートしていないビデオボード (3dfx Voodoo3 など) を搭載したコンピュータにも有効です。Java 2D システムが 32 ビットのテクスチャを使用する場合 (デフォルトでそうなっているとき)、32 ビットのテクスチャをサポートしていないカードを検出すると、高速化処理された半透明のイメージのサポートが無効になります。32 ビットのテクスチャをサポートしないビデオボードで半透明のイメージの高速化処理を行う必要がある場合は、d3dtexbpp プロパティを 16 に設定します。


ddforcevram

使用目的: VolatileImages を VRAM に保存しておくかどうかを指定します。
導入されたシステム: 1.4.1_02
デフォルト値: 1.4 では false。J2SE 5.0 Beta 1 以降は、translaccel が true の場合は true、それ以外は false
使用方法: 通常、2D システムが DirectDraw または Direct3D パイプラインを使用している場合、ビデオメモリ内のイメージがあまりにも頻繁に読み取られる (操作にかかる負荷が大きい) ときは、そのイメージをシステムメモリ表面にパントして、速く読み取れるようにします。あとになって、ユーザがこの表面から高速化処理された表面に再びコピーしていることが検出された場合、システムはそのイメージをビデオメモリにコピーするように促します。このプロパティを true に設定すると、パント機構が無効になり、常にイメージがビデオメモリに保存されるようになります。

注: OpenGL パイプラインを使用している場合、ddforcevram プロパティは効果がありません。

このプロパティは translaccel プロパティと組み合わせて使用されることがよくありますが、単独でも使用できます。このプロパティを true に設定する場合、5.0 リリースでは translaccel も true に設定するか、このプロパティを単独で設定してください。

-Dsun.java2d.ddforcevram=true

ddoffscreen

使用目的: Swing バックバッファなどのオフスクリーン表面に対する Java 2D システムによる DirectDraw と Direct3D の使用をオフにします。
導入されたシステム: 1.4
デフォルト値: true
使用方法: このフラグを false に設定すると、DirectDraw のオフスクリーン表面の高速化処理がオフになります。


ddscale

使用目的: DirectDraw または Direct3D パイプラインを使用しているときに、ハードウェア高速化処理されたスケーリングをオンにします。
導入されたシステム: 1.2
デフォルト値: false
使用方法: このフラグを true に設定すると、DirectDraw または Direct3D パイプラインを使用している場合にハードウェア高速化処理されたスケーリングが有効になります。DirectDraw または Direct3D のハードウェアスケーリングは、既存のアプリケーションの描画機能に悪影響を及ぼさないようにデフォルトで無効になっています。このような描画機能への悪影響は、ソフトウェアのスケーリング操作で使用される (最近傍の) スケーリングメソッドと、ビデオカードが使用するさまざまなスケーリングメソッドとの不整合によって発生します。アプリケーションの実行中に発生するいくつかのイベントによって、拡大縮小されたイメージは部分的にハードウェアのスケーリング操作で描画されたり、ソフトウェアのスケーリング操作で描画されたりするため、表示の整合性が保たれないことがあります。現時点では、ddscale フラグを true に設定することにより、高速化処理を有効にできます。


注: OpenGL パイプラインを使用している場合、ddscale プロパティは効果がありません。

関連情報 「High Performance Graphics」ホワイトペーパー


noddraw

使用目的: Java 2D システムによる DirectDraw と Direct3D の使用を完全にオフにします。
導入されたシステム: 1.2
デフォルト値: false
使用方法:このフラグを true に設定すると、DirectDraw の使用がオフになり、Win32 の描画に関する問題が解消されることがあります。


translaccel

使用目的: DirectDraw または Direct3D パイプラインを使用しているときに、半透明のイメージをハードウェア高速化処理するかどうかを指定します。
導入されたシステム: 1.4.1_02
デフォルト値: false
使用方法: DirectDraw または Direct3D パイプラインを使用しているときは、高速化処理される半透明のイメージに対して translaccelddforcevram を true に設定する必要があります。


注: OpenGL パイプラインを使用している場合、translaccel プロパティは効果がありません。

1.4 と 5.0 で半透明のイメージの高速化処理をオンにする場合

-Dsun.java2d.translaccel=true
-Dsun.java2d.ddforcevram=true //J2SE 5.0 Beta 1 以降は必要ありません

これらのプロパティがどちらも true である場合、Java 2D システムは半透明のイメージを VRAM に保存し、Direct3D を使ってそれらのイメージを画面または VolatileImage に描画 (合成) します。平行移動変換のみがサポートされています (回転や拡大縮小などは行えません)。5.0 よりも前で高速化処理を行うには、次のどちらかの方法で半透明なイメージを作成する必要があります。

5.0 以降では、BufferedImage コンストラクタを使って作成された半透明なイメージも高速化処理できます。特定のデバイス上でイメージを高速化処理できるかどうかを調べるには、Image getCapabilities メソッド (5.0 で追加) を使って ImageCapabilities オブジェクトを取得し、isAccelerated メソッドを使ってそのオブジェクトを問い合わせることができます。管理されるイメージは、画面または他の高速化処理された表面に何部かコピーされたあとでのみ高速化処理されるので注意してください。

次のコードは、高速化処理されたイメージの使用法を示しています。このコードでは、バックバッファが VolatileImage であるものとします。さらに、BufferStrategy も使用できます。

Image translucentImage = gc.createCompatibleImage(w, h, Transparency.TRANSLUCENT);
//...
Graphics2D g2 = (Grahics2D)backBuffer.getGraphics();
g2.drawImage(translucentImage, x, y, null);

SRC_OVER 規則 (デフォルトの Graphics2D 合成規則) を持つ特別なアルファとの合成が高速化処理されるため、次のコードでは合成にハードウェアを使用できるようになります。

Image translucentImage = gc.createCompatibleImage(w, h, Transparency.TRANSLUCENT);
// ...
float ea = 0.5;
Graphics2D g2 = (Grahics2D)backBuffer.getGraphics();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, ea));
g2.drawImage(translucentImage, x, y, null);

Linux と Solaris プラットフォームのシステムプロパティ

NO_J2D_DGA

使用目的: Solaris Sparc での DGA サポートとハードウェアの高速化をオフにします。これによって描画機能への悪影響が軽減することがあります。
導入されたシステム: 1.2
デフォルト値: (設定されていない)
使用方法: このプロパティは、環境変数としてのみ設定できます。つまり、同等のコマンド行フラグはありません。Solaris Sparc での DGA サポートとハードウェアの高速化をオフにするには、次の変数を定義します。
setenv NO_J2D_DGA

この変数が自動的に設定されると、ピックスマップが使用できるようになり、pmoffscreen が true に設定されます。ただし、逆の場合は当てはまりません。つまり、pmoffscreen を true に設定しても DGA は無効になりません。


J2D_PIXMAPS

使用目的: 頻繁に読み取られるイメージを保存するために 2D システムがローカル表示環境で共有メモリピックスマップを使用するかどうかを指定します。
導入されたシステム: 1.4 Beta 3
デフォルト値: (設定されていない)
使用方法: このプロパティは、環境変数としてのみ設定できます。つまり、同等のコマンド行フラグはありません。1.4 Beta 3 以降、Java 2D はイメージの保存に標準のピックスマップを使用するようになりましたが、頻繁に読み取られるイメージの保存にはローカル表示環境の共有メモリピックスマップを使用するように変更になりました。J2D_PIXMAPS 環境フラグを使用すると、このデフォルトの動作を無効にして、強制的にどちらかのタイプのピックスマップのみが使用されるようにできます。

    setenv J2D_PIXMAPS=shared
setenv J2D_PIXMAPS=server

このフラグを shared に設定すると、ローカル表示環境で作業している場合にすべてのイメージが共有メモリピックスマップに保存されます。これに対し、このフラグを server に設定すると、すべてのイメージが共有メモリピックスマップではなく、標準のピックスマップに保存されます。標準のピックスマップは、デバイスドライバの指定に基づいて VRAM に保存できます。

関連情報 「High Performance Graphics」ホワイトペーパー


pmoffscreen

使用目的: DGA が使用できないときに、Java 2D がデフォルトでピックスマップにイメージを保存するかどうかを指定します。
導入されたシステム: 1.4 Beta 3
デフォルト値: (設定されていない)
使用方法: 1.4 Beta 3 以降、DGA が使用できないときは、ローカルまたはリモートのどちらの表示環境で作業していても、Java 2D はデフォルトでピックスマップにイメージを保存します。pmoffscreen フラグを使用すると、この動作を変更できます。

    -Dsun.java2d.pmoffscreen=true
-Dsun.java2d.pmoffscreen=false

このフラグを false に設定すると、オフスクリーンピックスマップのサポートが無効になり、描画に関する問題が解決することがあります。このフラグを true に設定すると、DGA が使用できる場合でもオフスクリーンピックスマップのサポートが有効になります。

関連情報 「High Performance Graphics」ホワイトペーパー


Copyright © 1995-2004 Sun Microsystems, Inc.All Rights Reserved.

「Java 2D Feedback」ページを使ってコメントを送付してください。
 Sun Microsystems, Inc
Java ソフトウェア