質問

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

1)Eclipseバージョン3.6.0では、Mac OS Xの最新のJavaアップデート(1.6U10私は思う)では、デフォルトでハードウェアアクセラレーションが有効になっていますか?私はどこかでそれを読みました

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

ハードウェアアクセラレーションが有効になっているかどうかを示すことになっており、私のプログラムは、それが私のメインキャンバスインスタンスで描画のために実行されたときに真実であると報告します。ハードウェアの加速が現在有効になっていない場合、またはデフォルトでは、それを有効にするために何をしなければならないでしょうか?

2)緩衝液と揮発性障害の違いについて、私はあちこちでいくつかの記事を見てきました。主に、volatileImageはハードウェア加速画像であり、速いコピーフロム操作のためにVRAMに保存されていると述べています。しかし、私はまた、緩衝液がハードウェアが加速されると言われるいくつかのインスタンスを見つけました。私の環境では、BufferedImageハードウェアも加速していますか?両方のタイプがハードウェアが加速されている場合、ボラティレイメージを使用することの利点は何ですか?両方の加速度の場合に揮発性障害を発揮するという利点に対する私の主な仮定は、VRAMがいつ投棄されたかを検出できるということです。しかし、BufferedImageも現在の加速度をサポートしている場合、メモリがダンプされている場合に備えて、ユーザーから隠されているだけでなく、同じ種類の検出も組み込まれていませんか?

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

someGraphicsConfiguration.getCompatibleImage/getCompatibleVolatileImage()

とは対照的に

ImageIO.read()

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

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

5)どのAWT/スイングクラスがハードウェアの加速をサポートし、どのAWTクラスを使用する必要がありますか?現在、JFRAMEを拡張してウィンドウを作成するクラスを使用しており、そこからバッファストラテジーを作成するキャンバスを追加しています。これは良い習慣ですか、それとも私がこれを実装すべき他のタイプの方法がありますか?

お時間をいただきありがとうございます。明確な質問と十分な情報を提供していただければ幸いです。

役に立ちましたか?

解決

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

2)はい BufferedImage 揮発性メモリの管理の詳細の一部をカプセル化します。 BufferdImage 加速されますそのコピーはv-ramに保存されます。 VolatileImage.

aの利点 BufferedImage あなたがそれが含むピクセルをいじっていない限り、彼らをコールするようにそれらをコピーするだけです graphics.drawImage(), 、 そうして BufferedImage 特定の非指定数のコピーの後に加速され、 VolatileImage あなたのために。

aへの欠点 BufferedImage 画像編集を行っている場合、 BufferedImage, 、場合によっては、編集のためのパフォーマンスのレンダリングを探している場合は、その時点でそれを加速しようとすることをあきらめます。あなた自身の管理を検討する必要があります VolatileImage. 。どの操作が作られるのかわかりません BufferedImage あなたのためにレンダリングを加速しようとすることをあきらめてください。

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()

上記のプロセスでは、画像IO APIを使用して読み取り画像をBufferEdImageに変換します。これは、デフォルトの画面デバイスと互換性のある画像データモデルを備えたもので、レンダリングされたときに変換を行う必要がないようにします。これが最も有利な時期は、画像を非常に頻繁にレンダリングするときです。

4)ほとんどの場合、Javaはあなたのためにこれを行おうとするので、画像レンダリングをバッチする努力をする必要はありません。これを行うことができない理由はありませんが、一般的にアプリケーションをプロファイルし、このようなパフォーマンスの最適化を実行しようとする前に画像レンダリングコードにボトルネックがあることを確認することをお勧めします。主な欠点は、それぞれのJVMで私がわずかに異なる方法で実装され、その後強化が価値がないかもしれないことです。

5)私の知る限り、あなたが概説したデザインは、手動で積極的にアプリケーションをレンダリングする際に、より良い戦略の1つです。http://docs.oracle.com/javase/7/docs/api/java/awt/image/bufferstrategy.htmlこのリンクには、 BufferStrategy. 。説明では、コードスニペットが表示されます。これは、アクティブなレンダリングを行うための推奨される方法です。 BufferStrategy 物体。アクティブなレンダリングコードにこの特定の手法を使用しています。唯一の大きな違いは、私のコードの大きな違いです。あなたのように、私はそれを作成しました BufferStrategy のインスタンスで Canvas それをつけました JFrame.

他のヒント

いくつかから判断します 古いドキュメント, 、Sun JVMで、ハードウェアの加速がオンになっているかどうかを知ることができます。 sun.java2d.opengl 財産。

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

個々の画像がハードウェアが加速されているかどうかを確認できます Image's getCapabilities(GraphicsConfiguration).isAccelerated()

これをすべて言った後、私が見たすべてのドキュメント( これです)それを暗示します BufferedImageいいえ ハードウェアが加速しました。スイングも使用するように変更されています VolatileImageこの理由のために、その二重バッファリングのために。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top