このドキュメントでは、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' (Solaris, Linux, or Mac OS X bash shell) java SomeApp
一部のシステム・プロパティは、環境変数を使っても設定できます。たとえば、d3d
プロパティには同等の環境変数J2D_D3D
があります。プロパティの説明では、同等の環境変数がある場合はそれも示します。
このドキュメントでは、次のプロパティについて説明します。
opengl
使用目的: OpenGLベースのパイプラインを有効にして、ハードウェアの高速化を図ります。
導入されたシステム: 1.5 Beta 1 (Solaris/Linux)、1.5 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 SDKのJava 2Dの新機能, v1.5の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
使用目的: VolatileImage
をVRAMに保存しておくかどうかを指定します。
導入されたシステム: 1.4.1_02
デフォルト値: 1.4ではfalse。1.5 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
メソッドを使用して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が使用できる場合でもオフスクリーン・ピックスマップのサポートが有効になります。