12 Java 2Dパイプラインのレンダリングの選択およびプロパティ

Java 2Dでは一連のパイプラインが提供されます。パイプラインは、大まかには、グラフィック・プリミティブをプラットフォーム・サーフェスにレンダリングするための様々な方法と定義できます。

JDKでは、グラフィックをレンダリングするためにプラットフォーム固有のAPIを使用するため、使用可能なパイプラインはプラットフォームによって異なります。

パイプラインを選択するには、次のコマンドライン・オプションを使用します:

-Dsun.java2d.<pipeline_name>=True|true|false

  • 変数<pipeline_name>はパイプラインの名前です。使用可能なパイプライン名については、後続の項を参照してください。

  • 大文字で始まるTrueは、パイプラインが有効かどうかを示すメッセージを出力する詳細モードを有効にします。2つのパイプライン(非推奨)を選択し、選択したパイプラインが詳細オプションで有効になっていない場合、詳細モードは有効にならないことに注意してください。

  • 大文字で始まらないtrueはパイプラインを選択しますが、詳細モードは有効にしません。

  • falseは、このパイプラインを選択しないことを意味します。ただし、1つのパイプラインは必ず有効である必要があります。つまり、すべてのパイプラインにfalseを指定すると、1つのパイプラインが選択されます。また、一部のプラットフォームでは、一部のパイプラインは選択できません。他のパイプラインの選択解除のみできます。

すべてのプラットフォームに優先デフォルト・パイプラインがあり、有効にできる場合は自動的に選択されます。そうでない場合は、より基本的なパイプラインが選択されます(存在する場合)。パイプラインを有効にできない場合は、ウィンドウを作成できません。これはヘッドレス・モードと呼ばれます。JDKがディスプレイのある環境で実行され、ディスプレイにアクセスする権限がある場合、これはサポートされているプラットフォームでは発生しません。

Linuxパイプライン

次の3つのパイプラインを使用できます

  • x11: 可能な場合は、レンダリングにコアX11プリミティブを使用します。ただし、アンチエイリアス・レンダリングが必要な場合、実際の描画のほとんどはMIT共有メモリー拡張ピックスマップで行われ、その後、画面にブリット(ブール関数を使用してビットマップを1つに結合するプロセス)されます。
  • xrender: Xサーフェスへのより直接的なレンダリングを可能にするX11拡張機能。ほとんどの場合、この方が優れており、特にリモートXディスプレイでのアンチエイリアス・レンダリングのパフォーマンスが大幅に向上します。
  • opengl: OpenGL固定関数パイプラインを使用します。アクセラレーション・ドライバが使用可能な場合、これによりパフォーマンスが向上する可能性があります。

デフォルトのパイプラインはxrenderです。すべてのパイプラインが無効な場合、xrenderが選択されます。すべてのパイプラインが有効な場合、優先順位はopenglxrenderx11の順です。

Windowsパイプライン

次の3つのパイプラインを使用できます:

  • gdi: これは基本的に、Windowsグラフィック・デバイス・インタフェース(GDI)の基本的なビットマップ・ブリットのみを使用するソフトウェア専用パイプラインです。このパイプラインは名前がありません。つまり、名前を使用して選択または選択解除することはできません。
  • d3d: このパイプラインの名前は、Direct3Dの略です。使用可能な場合は推奨されますが、レンダリングの問題により、Intelグラフィック・カードでは無効になっています。さらに、このパイプラインでは、比較的古いバージョンのDirect3Dバージョン9が使用されます。
  • opengl: OpenGL固定関数パイプラインを使用します。OpenGLドライバに起因するレンダリング・アーティファクトが発生するため、完全に制御されたハードウェアおよびソフトウェア環境を除き、このパイプラインは推奨されません。

デフォルトのパイプラインはd3dです。すべてのパイプラインが無効な場合、gdi(名前なしパイプライン)が選択されます。すべてのパイプラインが有効な場合、優先順位はopengld3dgdiの順です。

Windowsパイプラインに関連するシステム・プロパティ

d3dパイプラインを無効にするには、「Windows上のJava 2Dプロパティ」の説明に従って、システム・プロパティsun.java2d.d3dfalseに設定します:

-Dsun.java2d.d3d=false

コマンドラインでシステム・プロパティを設定できない場合は、環境変数J2D_D3Dfalseに設定することで、d3dパイプラインを暗黙的に無効にできます。検出されたグラフィック・カードが無効リストに含まれている場合、d3dを明示的にリクエストしても、必ずしも有効化されるとはかぎりません。これを回避してd3dを強制的に選択するには、環境変数J2D_D3D_NO_HWCHECKtrueに設定します。この場合、レンダリング・アーティファクトが発生する可能性があります。

macOSパイプライン

次の2つのパイプラインを使用できます:

  • metal: AppleのOpenGLの代替を使用します。
  • opengl: OpenGL固定関数パイプラインを使用します。

デフォルトのパイプラインはmetalです。すべてのパイプラインが無効な場合、metalが選択されます。すべてのパイプラインが有効な場合、優先順位はmetalopenglの順です。したがって、次の2つのコマンドライン・オプションでは、macOSでopenglパイプラインが選択されます:

  • -Dsun.java2d.opengl=true
  • -Dsun.java2d.metal=false

Java 2Dパイプライン・クロスプラットフォーム診断

J2D_TRACE_LEVEL環境変数に1から5の値を設定して、高速化パイプライン(D3D、OpenGLおよびMetal)の起動プロシージャに関する詳細情報を取得します。値5は、最も詳細な情報を提供します。この診断は起動プロシージャのみを対象としています。

LinuxおよびWindowsでのOpenGLパイプライン

OpenGLパイプラインは、LinuxおよびWindowsで使用できます。

この代替パイプラインでは、VolatileImagesBufferStrategy APIで作成されたバック・バッファ、および画面へのレンダリング時に、ハードウェア高速化されたクロス・プラットフォームのOpenGL APIが使用されます。

このパイプラインはデフォルト(X11またはGDI/DirectDraw)のパイプラインに比べ、特定のアプリケーションでパフォーマンス上の大きな利点を提供できます。アルファ合成、アンチエイリアス、変換などのレンダリング操作を大量に使用するアプリケーションでは、このパイプラインを有効にすることを検討してください。

OpenGLパイプラインの問題のトラブルシューティングを行うユースケースを次に示します

OpenGLパイプラインの有効化

OpenGLパイプラインはデフォルトで無効になっています。

OpenGLパイプラインの有効化を試みるには、次のオプションをJVMに指定します。

-Dsun.java2d.opengl=True

OpenGLパイプラインが特定のスクリーンに対して正常に初期化されたかどうかに関する、詳細なコンソール出力を受け取るには、オプションをTrueに設定します(大文字「T」に注意)。

最小要件

ハードウェアまたはドライバが最小要件を満たしていなければ、OpenGLパイプラインは有効にされません。

次の要件のいずれかが満たされない場合、Java 2Dはフォール・バックしてデフォルト・パイプライン(LinuxのX11またはWindowsのGDI/DirectDraw)を使用するため、アプリケーションは正しく動作し続けますが、OpenGLの高速化は失われます。

Linuxオペレーティング・システムの最低要件を次に示します。

  • ハードウェア高速化のOpenGL/GLXライブラリがインストールされ、適切に構成されている

  • OpenGLのバージョンが1.2以降

  • GLXのバージョンが1.3以降

  • 使用可能な深度バッファ付きの、少なくとも1つのトゥルーカラー・ビジュアル

Windows OSの最小要件は、次のとおりです。

  • 拡張WGL_ARB_pbufferWGL_ARB_render_texture、およびWGL_ARB_pixel_formatをサポートするハードウェア高速化ドライバ

  • OpenGLのバージョンが1.2以降

  • 使用可能な深度バッファ付きの、少なくとも1つのピクセル形式

起動の問題の診断

OpenGLベースのJava 2Dパイプラインの起動手順に関する詳細情報を取得するには、J2D_TRACE_LEVEL環境変数を使用します。

前述したように、特定のマシン上で様々な理由でOpenGLパイプラインが有効にされない場合があります。たとえば、ドライバが正しくインストールされていない可能性や、報告されたバージョン番号が不十分である可能性があります。あるいは、マシンに搭載されている古いグラフィックス・カードがOpenGLの適切なバージョンや拡張をサポートしていない可能性もあります。

次の例に示すように、J2D_TRACE_LEVEL環境変数を使用してOpenGLベースのJava 2Dパイプラインの起動手順に関する詳細情報を取得できます。

Windowsでは、J2D_TRACE_LEVEL環境変数を設定します。

# set J2D_TRACE_LEVEL=4
# java -Dsun.java2d.opengl=True YourApp

Linuxでは、J2D_TRACE_LEVEL環境変数を設定します。

# export J2D_TRACE_LEVEL=4
# java -Dsun.java2d.opengl=True YourApp

その出力は、プラットフォームや取り付けられたグラフィックス・ハードウェアに応じて異なりますが、OpenGLパイプラインがユーザーの構成で正常に有効にされない理由に関する何らかの洞察を提供してくれます。

ノート:

この出力は特に、Java 2Dチーム宛のバグ・レポートを記入する際に特に役立ちます。

レンダリングおよびパフォーマンスの問題の診断

OpenGLパイプラインはベースとなるグラフィックス・ハードウェアやドライバに非常に強く依存しているため、レンダリングやパフォーマンスの問題の原因がJava 2D、OpenGLドライバのどちらなのかを判定しかねる場合があります。

GL_EXT_framebuffer_object拡張は、VolatileImagesの使用時にレンダリング・パフォーマンスの改善とVRAM消費量の低減を実現します。この「FBO」コード・パスは、OpenGLパイプラインが有効なときにデフォルトで有効になりますが、それは、グラフィックス・ハードウェアとドライバがこのOpenGL拡張をサポートしている場合に限られます。この拡張は一般に、Nvidia GeForce/Quadro FXシリーズ以降およびATI Radeon 9500以降で使用できます。「FBO」コード・パスがアプリケーションの問題の原因となっている疑いがある場合、次のシステム・プロパティを設定してそれを無効にできます:

-Dsun.java2d.opengl.fbobject=false

このプロパティが設定されると、Java 2Dは古いpbuffer-based コード・パスにフォール・バックします。

特定のJava 2D操作で得られる視覚的な結果が、OpenGLパイプラインを有効にしたときとしなかったときで異なる場合、それはおそらく、グラフィックス・ドライバのバグを示しています。同様に、OpenGLパイプラインを有効にしたときに、しなかった場合よりもJava 2Dレンダリングのパフォーマンスが大幅に悪化する場合、その原因はおそらくドライバまたはハードウェアの問題です。

どちらの場合も、通常のバグ報告チャネルを通じて詳細なバグ・レポートを提出してください。「バグ・レポートの提出」を参照してください。バグ・レポートの提出時にはできるだけ詳しく記述し、次の情報を含めてください。

  • オペレーティング・システム(Ubuntu Linux 6.06、Windows XP SP2など)
  • グラフィックス・ハードウェアの製造元とデバイスの名前(Nvidia GeForce 2 MX 440など)
  • ドライバの正確なバージョン(ATI Catalyst 6.8、Nvidia 91.33など)
  • J2D_TRACE_LEVEL=4をコマンド行に指定したときの出力(前の項で説明)
  • Linuxを使用している場合は、glxinfoコマンドの出力

最新のOpenGLドライバ

OpenGLパイプラインはOpenGL APIおよびベースとなるグラフィックス・ハードウェアやドライバに強く依存しているため、最新のグラフィックス・ドライバがマシンにインストールされているのを確認することが非常に重要です。ドライバは、グラフィックス・カードの製造元のWebサイトからダウンロードできます(次の表を参照)。

製造元 プラットフォーム 動作確認済みのカード

AMD/ATI

Linux、Windows

Radeon 8500以降、FireGLシリーズ

Nvidia

Linux、Windows

GeForce 2シリーズ以降、Quadro FXシリーズ以降

Xi Graphics

Linux

各種(Xi Graphicsで確認)