12

多くの 2D 変換とシェイプ レンダリングを行う高速なイメージ ジェネレーターを作成しようとしているので、BufferedImage を使用してから、Graphics2D オブジェクトを取得してすべての描画を実行しようとしています。私の主な関心事は、作成が非常に高速であるため、次のような BufferedImage を作成することです。

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage bImage = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
Graphics2D graphics = bImage.createGraphics();

しかし、もしそうなら:

System.out.println(bImage.getCapabilities(gc).isAccelerated());

-Dsun.java2d.opengl=True で JVM を起動しても、出力は常にfalseで、次の行が出力されます。

OpenGL pipeline enabled for default config on screen 0

最終的に ImageIO.write(bImage, "PNG", file); で PNG ファイルに保存したいので、BufferedImage を実行しています。

高速化されていると言う VolatileImage を作成できますが、保存しようとすると ImageIO が気に入らず、そのイメージを RenderedImage にキャストできないと言います。ディスクに保存できる高速化されたイメージを取得する方法についてのアイデアはありますか? また、画像が非常に大きく、メモリ不足の問題が発生するため、保存するために VolatileImage と BufferedImage へのコピーを作成したくありません...

4

3 に答える 3

6

私の調査と Sun/Oracle 2D チュートリアルを読んだ結果、次のことがわかりました。

高速化されたイメージを作成するには、pbuffer として作成される揮発性イメージを使用できます。長所と短所があります。VolatileImages は、ラスター ピクセル データを取得しようとするまでは高速です。その時点で、それらは通常の bufferedImage になります。また、これらは揮発性であり、レンダリングの最後に使用できるという保証はありません。これを行うには、次を実行します。

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
VolatileImage vImage = gc.createCompatibleVolatileImage(width, height, Transparency.TRANSLUCENT);

これにより高速化された画像が得られますが、ImageIO を使用して直接 PNG ファイルに書き込むことはできません。

通常の BufferedImage を使用するには、次のようにする必要があります。

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage img = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
img.setAccelerationPriority(1);

これにより、高速化されていない BufferedImage が作成されますが、setAccelerationPriority に 1 を渡すことで、JVM にヒントを与える必要があります。これは、Java チュートリアルの 2D トレイルで読むことができます。

于 2010-03-11T16:52:59.087 に答える
1

これをコマンドラインに追加してみてください:

-Dsun.java2d.accthreshold=0

編集

上記が機能しないとあなたが言った後、私はこれについていくつか読みました。OpenGL パラメータのTrueをすべて小文字に変更してみてください。

-Dsun.java2d.opengl=true
于 2010-03-03T20:20:15.363 に答える
0

仕組みは次のとおりです。

イメージを作成する方法は正しいです。しかし、Java はイメージをすぐに高速化するわけではありません。画像に向ける必要があるレンダリング呼び出しのしきい値があり、その後画像が高速化されます。しかし、次のように設定すると、

-Dsun.java2d.accthreshold=0

イメージを作成した瞬間に加速する必要があります。

高速化するには、何らかの形でイメージを使用する必要がある場合があります。たとえば、読み込まれたイメージを新しい BufferedImage にコピーするために使用される次のコードがあります (ImageIO を介して読み込むと、高速化できないイメージが得られます)。

Graphics2D g2d = bufferedImage.createGraphics();
g2d.drawImage(image,0,0,null);
g2d.dispose();

このコード セグメントの前では、BufferedImage は高速化されませんが、後で高速化されます。

ただし、画像データを直接 (つまり、Java-2d を使用せずに) 操作すると、画像は VRAM にキャッシュされなくなり、アクセラレーションを回復するために新しいマネージド イメージにコピーする必要があることに注意してください。

于 2010-03-06T13:48:14.350 に答える