20

私は Java のハードウェア アクセラレーション機能を調べるのに時間を費やしてきましたが、オンラインで直接見つけたサイトのどれも、私が持っている質問のいくつかに明確に答えていないので、まだ少し混乱しています。Java でのハードウェア アクセラレーションに関する質問は次のとおりです。

1) Eclipse バージョン 3.6.0 では、Mac OS X 用の最新の Java アップデート (1.6u10 だと思います) では、ハードウェア アクセラレーションがデフォルトで有効になっていますか? どこかで読んだ

someCanvas.getGraphicsConfiguration().getBufferCapabilities().isPageFlipping()

ハードウェア アクセラレーションが有効になっているかどうかを示すはずで、私のプログラムは、メインの Canvas インスタンスで描画用に実行すると true を返します。現在、またはデフォルトでハードウェア アクセラレーションが有効になっていない場合、有効にするにはどうすればよいですか?

2) BufferedImage と VolatileImage の違いに関するいくつかの記事をあちこちで見てきました。主に、VolatileImage はハードウェア アクセラレーションされたイメージであり、高速なコピー操作のために VRAM に格納されていると述べています。ただし、BufferedImage もハードウェア アクセラレーションであると言われている例をいくつか見つけました。BufferedImage ハードウェアも私の環境で加速されますか? 両方のタイプがハードウェア アクセラレーションされている場合、VolatileImage を使用する利点は何ですか? 両方が高速化されている場合に VolatileImage を使用する利点についての私の主な仮定は、VolatileImage がその VRAM がいつダンプされたかを検出できるということです。しかし、BufferedImage もアクセラレーションをサポートしている場合、メモリがダンプされた場合に備えて、ユーザーから隠されているだけで、同じ種類の検出が組み込まれているのではないでしょうか?

3)使用する利点はありますか

someGraphicsConfiguration.getCompatibleImage/getCompatibleVolatileImage()

とは対照的に

ImageIO.read()

チュートリアルでは、レンダリングウィンドウを適切に設定することに関するいくつかの一般的な概念について読んでいます(チュートリアル)、BufferedImageを返すと思われるgetCompatibleImageメソッドを使用して、高速描画用の「ハードウェアアクセラレーション」画像を取得します。 2 ハードウェアアクセラレーションの有無について。

4) これはハードウェア アクセラレーションが少ないですが、私が興味を持っていることです: どのグラフィックスを描画するかを注文する必要がありますか? C/C++ 経由で OpenGL を使用する場合、現在のテクスチャを切り替える必要がある回数を減らすために、一度に描画する必要があるすべての場所に同じグラフィックを描画するのが最善であることを知っています。私が読んだ限りでは、Java がこれを処理し、物事が最適な方法で描画されるようにしているように見えますが、繰り返しになりますが、このようなことを明確に言ったことはありません。

5) どの AWT/Swing クラスがハードウェア アクセラレーションをサポートしていますか? また、どのクラスを使用する必要がありますか? 現在、JFrame を拡張してウィンドウを作成するクラスを使用しており、それに Canvas を追加して、そこから BufferStrategy を作成しています。これは良い習慣ですか、それともこれを実装する必要がある他のタイプの方法はありますか?

お時間を割いていただき、誠にありがとうございます。いくつかの質問にお答えいただけるよう、明確な質問と十分な情報を提供できれば幸いです。

4

2 に答える 2

18

1)これまでのところ、ハードウェアアクセラレーションはデフォルトで有効になることはなく、私の知る限り、まだ変更されていません。レンダリングアクセラレーションをアクティブにするには、プログラムの起動時にこの引数(-Dsun.java2d.opengl = true)をJavaランチャーに渡すか、レンダリングライブラリを使用する前に設定します。System.setProperty("sun.java2d.opengl", "true");これはオプションのパラメータです。

2)はいBufferedImage、揮発性メモリの管理の詳細の一部をカプセル化します。これは、BufferdImageが加速されると、そのコピーがV-Ramにとして保存されるためVolatileImageです。

aのBufferedImage利点は、含まれているピクセルをいじらない限り、への呼び出しのようにそれらをコピーすることです。graphics.drawImage()その後BufferedImage、特定の指定されていないコピー数の後に加速され、それがあなたのために管理VolatileImageします。

の欠点BufferedImageは、画像編集を行っている場合、ピクセルを変更してBufferedImageいる場合、場合によってはそれを加速しようとすることを諦めることです。その時点で、編集用のパフォーマンスの高いレンダリングを探している場合は、独自の管理を検討する必要があります。VolatileImageBufferedImageどの操作がレンダリングの高速化を諦めるのかわかりません。

3)を使用する利点は、デフォルトでサポートされている画像データモデルへの変換が行わcreateCompatibleImage()/createCompatibleVolatileImage()ImageIO.read()ないことです。したがって、PNGをインポートすると、PNGリーダーによって作成された形式で表示されます。つまり、によってレンダリングされるたびに、GraphicsDevice最初に互換性のある画像データモデルに変換する必要があります。

BufferedImage image = ImageIO.read ( url );
BufferedImage convertedImage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
GraphicsDevice gd = ge.getDefaultScreenDevice ();
GraphicsConfiguration gc = gd.getDefaultConfiguration ();
convertedImage = gc.createCompatibleImage (image.getWidth (), 
                                           image.getHeight (), 
                                           image.getTransparency () );
Graphics2D g2d = convertedImage.createGraphics ();
g2d.drawImage ( image, 0, 0, image.getWidth (), image.getHeight (), null );
g2d.dispose()

上記のプロセスでは、image io apiで読み込まれた画像が、デフォルトの画面デバイスと互換性のある画像データモデルを持つBufferedImageに変換されるため、レンダリング時に変換を行う必要はありません。これが最も有利なのは、画像を非常に頻繁にレンダリングする場合です。

4)ほとんどの場合、Javaが自動的にこれを試行するため、画像レンダリングをバッチ処理するための努力をする必要はありません。これを実行できない理由はありませんが、一般に、このようなパフォーマンスの最適化を実行する前に、アプリケーションのプロファイルを作成し、画像レンダリングコードにボトルネックがあることを確認することをお勧めします。主な欠点は、JVMごとに実装方法が少し異なるため、拡張機能が役に立たない可能性があることです。

5)私の知る限り、あなたが概説した設計は、ダブルバッファリングを手動で実行し、アプリケーションをアクティブにレンダリングする場合の優れた戦略の1つです。 http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferStrategy.html このリンクには、の説明がありBufferStrategyます。説明では、オブジェクトを使用してアクティブレンダリングを行うための推奨される方法であるコードスニペットを示していBufferStrategyます。この特定の手法をアクティブなレンダリングコードに使用します。唯一の大きな違いは、私のコードにあることです。あなたのように、私は私が置いたBufferStrategyのインスタンス上にを作成しました。CanvasJFrame

于 2012-12-12T04:30:20.857 に答える
2

いくつかの古いドキュメントから判断すると、プロパティを確認することで、Sun JVM でハードウェア アクセラレーションがオンになっているかどうかを確認できsun.java2d.openglます。

残念ながら、これが Apple JVM に当てはまるかどうかはわかりません。

Imageを使用して、個々のイメージがハードウェア アクセラレーションされているかどうかを確認できます。getCapabilities(GraphicsConfiguration).isAccelerated()

以上のことをすべて言いましたが、私が見たすべてのドキュメント (これを含む) は、ハードウェア アクセラレーションでBufferedImageないことを暗示しています。Swing もVolatileImage、まさにこの理由から、ダブルバッファリングに s を使用するように変更されました。

于 2011-01-07T16:02:35.333 に答える