B Java 2Dのプロパティ

この付録では、Java 2Dのトラブルシューティングに役立つ可能性のあるプロパティを示します。

この付録の内容は次のとおりです。

すべてのプラットフォームに共通するJava 2Dプロパティ

高DPIディスプレイでは、Java 2D APIは、次のようにディスプレイに合せて自動的にスケーリングされます:

  • Windows: すべてのウィンドウ・スケーリングが正確に適用されます。
  • Linux (X11): スケーリングは、デスクトップ・スケールが2以上(切捨て)の場合にのみ適用されます。
  • macOS: macOSがRetinaディスプレイの使用(2倍スケーリング、切捨て)を検出した場合、スケーリングが適用されます。macOSでは、スケーリングはオフスクリーン・バッファにのみ影響します

物理的な(実世界のインチおよびセンチメートル)ウィンドウ・サイズは影響を受けません。

高DPIスケーリングを無効にするには、次のプロパティを指定します:

-Dsun.java2d.uiScale.enabled=false

または、スケーリング係数を指定します(プラットフォームの制限に従います):

-Dsun.java2d.uiScale=1.0

スケーリング係数は環境変数で指定できます。たとえば、次の例ではスケーリング係数を2に設定します:

J2D_UISCALE=2.0

Linux上のJava 2Dプロパティ

次に、Linuxの有用なJava 2Dプロパティを示します。

ノート:

LinuxのJava 2Dプロパティのデフォルト値では、通常、最高のパフォーマンスが得られます。必要な場合にのみ変更します。

Linuxのデフォルト・パイプラインはXrenderパイプラインです。このデフォルトを変更するには次のようにします。

  • -Dsun.java2d.xrender=false – Xrenderパイプラインを無効にし、基本的なX11パイプラインにフォールバックします
  • -Dsun.java2d.opengl=true - OpenGLパイプラインの有効化を試みます

デフォルトでは、X11ベースのパイプラインを使用する場合、MIT共有メモリー拡張(MIT-SHM)が使用されます(使用可能な場合)。MIT-SHMを使用しない場合は、次のように環境変数を設定します:

set NO_J2D_MITSHM=true

X11リモート・ディスプレイでオフスクリーン・ピックスマップを無効にするには、次のプロパティを指定します:

-Dsun.java2d.pmoffscreen=false

ノート:

これは、X11をパイプラインとして使用する場合に重要でした。ただし、Xrender(デフォルト・パイプライン)はリモートのピックスマップへの合成が可能であるため、これはほとんどのアプリケーションで必要なく、役に立たない場合もあります。

環境変数J2D_PIXMAPSの値を次のように指定して、共有ピックスマップおよびサーバー・ピックスマップの使用を制御します:

  • J2D_PIXMAPS unset – 必要に応じて両方のタイプを使用します
  • J2D_PIXMAPS=shared - 共有メモリー・ピックスマップのみを使用します
  • J2D_PIXMAPS=server – サーバー側のピックスマップのみを使用します

ノート:

一般に、ピックスマップに関連するオプションの設定は慎重な実験が必要であり、明確な測定可能な利点がある場合にのみ採用する必要があります。

次のようにFORCEDEFVIS環境変数の値を指定して、デフォルトのXビジュアルを制御します:

  • FORCEDEFVIS unset – 使用可能な最適なビジュアルが使用されます
  • FORCEDEFVIS <hexadecimal value> – 16進数値をIDとする有効なビジュアルを使用します

Windows上のJava 2Dプロパティ

次に、Windowsの有用なJava 2Dプロパティを示します。

D3Dパイプラインは、Windowsのデフォルトのパイプラインです。このデフォルトを変更するには、システム・プロパティsun.java2d.d3dまたはsun.java2d.opengl、あるいは環境変数J2D_D3DまたはJ2D_D3D_NO_HWCHECKの値を指定します:

  • -Dsun.java2d.d3d=false – Direct3Dパイプラインの使用を無効にします(かわりにGDIが使用されます)
  • -Dsun.java2d.opengl=true - OpenGLパイプラインの有効化を試みます
  • J2D_D3D=true – Direct3Dパイプラインの使用を有効にします(ハードウェア・チェックの対象)
  • J2D_D3D=false – Direct3Dパイプラインの使用を無効にします
  • J2D_D3D_NO_HWCHECK=true – 既知の問題があるグラフィック・チップおよびD3Dドライバのチェックを無効にします

ノート:

JDK 8では、sun.java2d.dpiawareシステム・プロパティをtrueまたはfalseに設定できます:
  • -Dsun.java2d.dpiaware=true – JDKが、デスクトップのスケールに基づいてグラフィックをレンダリングします
  • -Dsun.java2d.dpiaware=false – オペレーティング・システムが、デスクトップのスケールに基づいてJavaアプリケーションのグラフィックをレンダリングします

デフォルトでは、デスクトップのスケールが150%未満の場合、JDKがグラフィックをレンダリングします。それ以外の場合は、WindowsがJavaアプリケーションのグラフィックをレンダリングします。デスクトップのスケールが150%以上である場合、ぼやけたレンダリングが発生する可能性があります。これは、JDKが理想の解像度でテキスト、ジオメトリまたはマルチ解像度のイメージをレンダリングしなくなるためです。JDKは、SwingアプリケーションでClearTypeではなくグレースケールのテキスト・レンダリングを使用することで、この問題を部分的に補正します。

JDK 8環境で実行されているアプリケーションが、デスクトップのスケールが150%以上の場合にぼやけており、より鮮明で小さいレンダリングを希望する場合は、sun.java2d.dpiawaretrueに設定するか、またはデスクトップのスケールを100%や125%などの低い値に変更します。

ただし、JDK 9以降では、システム・プロパティsun.java2d.dpiawarefalseに設定しても効果はありません。Javaランチャおよびコンパイラ(java.exejavaw.exe)には、trueに設定されている高DPIマニフェスト・エントリ(<dpiAware>)が含まれており、コードから無効にできません。このオプションを使用できるのは、このマニフェスト・エントリを設定しないカスタム・ネイティブJavaランチャのみです。

macOSでのJava 2Dプロパティ

次の表に、macOSで役立つJava 2Dプロパティをいくつか示します。

表B-1 macOS上のJava 2Dプロパティ

システム・プロパティ デフォルト値 説明
sun.java2d.metal JDK 19以降: true

JDK 17および18: false

trueの場合、MetalはデフォルトのJava 2Dレンダリング・パイプラインです。
sun.java2d.opengl JDK 19以降: false

JDK 18以前: true

trueの場合、OpenGLはデフォルトのJava 2Dレンダリング・パイプラインです。