このドキュメントでは、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 shell) java SomeApp
一部のシステムプロパティーは、環境変数を使っても設定できます。たとえば、d3d
プロパティーには同等の環境変数 J2D_D3D
があります。プロパティーの説明では、同等の環境変数がある場合はそれも示します。
このドキュメントでは、次のプロパティーについて説明します。
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
オブジェクトに対して行われた呼び出しの数が、実行されたプリミティブの操作の数に直接マップされるとはかぎりません。
src
と dst
は、操作に関係する表面またはソースデータのタイプを表します。
composite
名は、AlphaComposite
クラスに含まれる名前に接尾辞「NoEa
」を付けたものとかなり正確に一致し、AlphaComposite
インスタンスに「特別なアルファ」属性 1.0 が設定されていることを意味します。「SrcNoEa」タイプはもっともよく使われる合成タイプであり、混合を必要としないもっとも簡単なピクセルの転送方法を表します。不透明な色やイメージがレンダリングされるときは、デフォルトの合成が「SrcOver」であっても、内部では「SrcNoEa」が頻繁に使用されます。これは、不透明なソースピクセルの場合は、それらの 2 つの操作の見分けがつかないためです。
プラットフォームのレンダリングパイプラインは、X11、GDI、DirectDraw などのプラットフォームのレンダラがアクセスできる表面に対して不透明な操作を行うために使用されることがあります。現在のところ、それらの名前は、簡略化された名前付け形式に従って、プラットフォームのレンダラを表す接頭辞と操作の名称から構成され、クラス名やオペランドタイプのリストは含みません。たとえば、「X11DrawLine」、「GDIFillOval」、「DXFillRect」となります。今後は、これらの名前はほかのプリミティブの名前と非常によく似たものになる予定です。
awt.useSystemAAFontSettings
使用目的: アンチエイリアス設定が「デスクトップの設定」として認識されているテキストをオーバーライドします。
導入されたシステム: 1.6
デフォルト値: true。
使用方法: コマンド行または Web Start の jnlp ファイルに、次の指定の値のいずれかを設定し、Swing テキストが使用するレンダリングヒントを制御します。
厳密に言えば、このフラグが Java 2D を制御するわけではありませんが、これらの値が Java 2D テキストアンチエイリアス処理レンダリングヒントの値に直接マッピングされるため、ここではそのように説明しています。
フラグが実際に行うことは、JRE がユーザーのデスクトップ設定から読み取るものを、ユーザーのデスクトップアンチエイリアス処理テキストの設定内容としてオーバーライドすることです。Swing は、Java 2D に Swing テキストをレンダリングするよう指示し、その設定に合わせます。つまり、オーバーライドすることで、Swing テキストを制御できます。これは、Metal L&F (別名 Java L&F) やネイティブ (Windows、GTK) Swing L&F の標準 Swing コンポーネントに当てはまります (JTextArea、JButton)。また、カスタムコンポーネントや、同じプロパティーを取得する L&F にも当てはまります。
このオーバーライドするデスクトップ設定の詳細については、「AWT デスクトッププロパティー」を参照してください。
このプロパティーを指定するいくつかの理由として、次のものが挙げられます。
System Property Value | java.awt.RenderingHint value "off"|"false"|"default" : VALUE_TEXT_ANTIALIAS_DEFAULT "on" : VALUE_TEXT_ANTIALIAS_ON "gasp" : VALUE_TEXT_ANTIALIAS_GASP "lcd"|"lcd_hrgb" : VALUE_TEXT_ANTIALIAS_LCD_HRGB "lcd_hbgr" : VALUE_TEXT_ANTIALIAS_LCD_HBGR "lcd_vrgb" : VALUE_TEXT_ANTIALIAS_LCD_VRGB "lcd_vbgr" : VALUE_TEXT_ANTIALIAS_LCD_VBGR
accthreshold
廃止: Java SE 6 Update 10
使用目的: VRAM バージョンのイメージが自動的に作成される前に、管理されるイメージから行われるコピー数を指定します。
導入されたシステム: 1.4.1_02
デフォルト値: 1
使用方法: イメージの初期化中に高速化処理された表面を強制的に作成するには、次のように、この値を 0 に設定します。
-Dsun.java2d.accthreshold=0
このプロパティーを使用すると、最初にいくつかのコピーが行われたあとで、イメージが VRAM にコピーされているときに、レンダリングの初期遅延を解消できます。初期遅延は、事実上イメージ作成時間へシフトされます。
この動作は、アプリケーションがイメージ管理をうまく利用できること、つまり、開始早々速度の遅いコピー処理にわずらわされ、あとになってコピーのオーバーヘッドを負うのではなく、開始時にコピーのオーバーヘッドを片付けられることがわかっている場合には有効です。
d3d
J2D_D3D
-Dsun.java2d.d3d=false引き続き問題が発生している場合は、
ddoffscreen
プロパティーを false に設定してみてください。それでも問題が解決されない場合は、noddraw
を true に設定してみてください。d3dtexbpp
廃止: Java SE 6 Update 10
使用目的: 管理されるイメージまたは半透明のイメージの高速化処理された表面の形式を 16 ビット (4444) にすることを指定します。これにより、VRAM とシステムメモリーを節約できますが、品質は低下します。
導入されたシステム: 1.4.1_02
デフォルト値: 32
使用方法: 4444 形式をオンにするには、このプロパティーを 16 に設定します。
-Dsun.java2d.d3dtexbpp=16
d3dtexbpp
プロパティーは効果がありません。
このプロパティーを 16 に設定すると、管理されるイメージ (GraphicsConfiguration.createCompatibleImage(w,h, TRANSLUCENT)
で作成されたイメージ) または Toolkit.getImage
でロードされた半透明なイメージの高速化処理された表面の形式が強制的に 4444 になります。同様に、これらのイメージのシステムメモリー表面も 4444 形式になります。
このオプションは、多数のイメージを VRAM に保存する場合に有効です。ただし、品質は劣化します。
このオプションは、32 ビットのテクスチャーをサポートしていないビデオボード (3dfx Voodoo3 など) を搭載したコンピュータにも有効です。Java 2D システムが 32 ビットのテクスチャーを使用する場合 (デフォルトでそうなっているとき)、32 ビットのテクスチャーをサポートしていないカードを検出すると、高速化処理された半透明のイメージのサポートが無効になります。32 ビットのテクスチャーをサポートしないビデオボードで半透明のイメージの高速化処理を行う必要がある場合は、d3dtexbpp
プロパティーを 16 に設定します。
ddforcevram
廃止: Java SE 6 Update 10
使用目的: VolatileImages
を VRAM に保存しておくかどうかを指定します。
導入されたシステム: 1.4.1_02
デフォルト値: 1.4 では false。J2SE 5.0 Beta 1 以降は、translaccel
が true の場合は true、それ以外は false
使用方法: 通常、2D システムが DirectDraw または Direct3D パイプラインを使用している場合、ビデオメモリー内のイメージがあまりにも頻繁に読み取られる (操作にかかる負荷が大きい) ときは、そのイメージをシステムメモリー表面にパントして、速く読み取れるようにします。あとになって、ユーザーがこの表面から高速化処理された表面にふたたびコピーしていることが検出された場合、システムはそのイメージをビデオメモリーにコピーするように促します。このプロパティーを true に設定すると、パントメカニズムが無効になり、常にイメージがビデオメモリーに保存されるようになります。
ddforcevram
プロパティーは効果がありません。
このプロパティーは translaccel
プロパティーと組み合わせて使用されることがよくありますが、単独でも使用できます。このプロパティーを true に設定する場合、5.0 リリースでは translaccel
も true に設定したり、このプロパティーを単独で設定したりしてください。
-Dsun.java2d.ddforcevram=true
ddoffscreen
廃止: Java SE 6 Update 10、これには D3D の新しい実装のサポートが含まれます。sun.java2d.ddoffscreen=false
の設定は、sun.java2d.d3d=false
によって、それを無効にした場合とまったく同じように解釈されるようになりました。
使用目的: Swing バックバッファーなどのオフスクリーン表面に対する Java 2D システムの DirectDraw と Direct3D の使用をオフにします。
導入されたシステム: 1.4
デフォルト値: true
使用方法: このフラグを false に設定すると、DirectDraw のオフスクリーン表面の高速化処理がオフになります。
ddscale
廃止: Java SE 6 Update 10
使用目的: DirectDraw または Direct3D パイプラインを使用しているときに、ハードウェア高速化処理されたスケーリングをオンにします。
導入されたシステム: 1.2
デフォルト値: false
使用方法: このフラグを true に設定すると、DirectDraw または Direct3D パイプラインを使用している場合にハードウェア高速化処理されたスケーリングが有効になります。DirectDraw または Direct3D のハードウェアスケーリングは、既存のアプリケーションのレンダリング機能に悪影響を及ぼさないようにデフォルトで無効になっています。このようなレンダリング機能への悪影響は、ソフトウェアのスケーリング操作で使用される (最近傍の) スケーリングメソッドと、ビデオカードが使用するさまざまなスケーリングメソッドとの不整合によって発生します。アプリケーションの実行中に発生するいくつかのイベントによって、拡大縮小されたイメージは部分的にハードウェアのスケーリング操作でレンダリングされたり、ソフトウェアのスケーリング操作でレンダリングされたりするため、表示の整合性が保たれないことがあります。現時点では、ddscale
フラグを true に設定することにより、高速化処理を有効にできます。
ddscale
プロパティーは効果がありません。
関連情報: 「High Performance Graphics」ホワイトペーパー
noddraw
廃止: Java SE 6 Update 10、これには D3D の新しい実装のサポートが含まれます。sun.java2d.noddraw=true
の設定は、sun.java2d.d3d=false
によって、それを無効にした場合とまったく同じように解釈されるようになりました。
使用目的: Java 2D システムによる DirectDraw と Direct3D の使用を完全にオフにします。
導入されたシステム: 1.2
デフォルト値: false
使用方法: このフラグを true に設定すると、DirectDraw の使用がオフになり、Win32 のレンダリングに関する問題が解消されることがあります。
translaccel
廃止: Java SE 6 Update 10
使用目的: DirectDraw または Direct3D パイプラインを使用しているときに、半透明のイメージをハードウェア高速化処理するかどうかを指定します。
導入されたシステム: 1.4.1_02
デフォルト値: false
使用方法: DirectDraw または Direct3D パイプラインを使用しているときは、高速化処理される半透明のイメージに対して translaccel
と ddforcevram
を true に設定する必要があります。
translaccel
プロパティーは効果がありません。
1.4 と 5.0 で半透明のイメージの高速化処理をオンにする場合
-Dsun.java2d.translaccel=true -Dsun.java2d.ddforcevram=true //unnecessary as of 1.5 Beta 1
これらのプロパティーがどちらも true である場合、Java 2D システムは半透明のイメージを VRAM に保存し、Direct3D を使ってそれらのイメージを画面または VolatileImage
にレンダリング (合成) しようとします。平行移動変換のみがサポートされています (回転や拡大縮小などは行えません)。5.0 よりも前で高速化処理を行うには、次のどちらかの方法で半透明なイメージを作成する必要があります。
GraphicsConfiguration.createCompatibleImage(w,h, Transparency.TRANSLUCENT)
Toolkit.getImage()
を使ってイメージをロードする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);
NO_J2D_DGA
setenv NO_J2D_DGA
この変数が自動的に設定されると、ピックスマップが使用できるようになり、実質的に pmoffscreen
が true に設定されます。ただし、逆の場合は当てはまりません。つまり、pmoffscreen
を true に設定しても DGA は無効になりません。
J2D_PIXMAPS
J2D_PIXMAPS
環境フラグを使用すると、このデフォルトの動作をオーバーライドして、強制的にどちらかのタイプのピックスマップのみが使用されるようにできます。
setenv J2D_PIXMAPS=shared
setenv J2D_PIXMAPS=server
このフラグを shared
に設定すると、ローカル表示環境で作業している場合にすべてのイメージが共有メモリーピックスマップに保存されます。これに対し、このフラグを server
に設定すると、すべてのイメージが共有メモリーピックスマップではなく、標準のピックスマップに保存されます。標準のピックスマップは、デバイスドライバの指定に基づいて VRAM に保存できます。
関連情報: 「High Performance Graphics」ホワイトペーパー
xrender
-Dsun.java2d.xrender=true
を設定して有効にできます。古い X11 構成では、XRender をサポートできないことがあります。詳細形式 -Dsun.java2d.xrender=True
を使用すると、パイプラインが実際に有効にされているかどうかを示すメッセージを標準出力に出力できます。 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 が使用できる場合でもオフスクリーンピックスマップのサポートが有効になります。