2016-10-11 11 views
3

JavaFXでCanvasを使用して小さなグラフィックエンジンを開発しています。ある時点では、画面外のイメージをレンダリングして、それをGraphicContextを使って私のプライマリキャンバスに印刷しなければなりませんでした。
私は今、このコードを使用しています:JavaFX上のCanvas.snapshot()の代替手段

private Canvas offScreenCanvas; 
private GraphicsContext offScreenGraphic; 
private SnapshotParameters parameters; 
private WritableImage offScreenImage; 

[...] 

offScreenCanvas = new Canvas(WIDTH, HEIGHT); 
offScreenGraphic = offScreenCanvas.getGraphicsContext2D(); 

parameters = new SnapshotParameters(); 
parameters.setFill(Color.TRANSPARENT); 

[...] 

offScreenImage = offScreenCanvas.snapshot(parameters, offScreenImage); 
graphic.setGlobalBlendMode(BlendMode.HARD_LIGHT); 
graphic.drawImage(offScreenImage, 0, 0); 
graphic.setGlobalBlendMode(BlendMode.SRC_OVER); 

私の問題は、各実行で、〜14ms、あまりにも多くの時間を要するsnaphot()方法です。私は少なくとも60fpsでキャンバスを更新する必要があるので、これは実際に描画する必要があります。

ImageまたはWritableImageをキャンバスから入手する別の方法はありますか?多分別のプロセスですか?

+0

'setFill(Paint)'にもかかわらず、 'SnapshotParameters'で何をやっていますか? AFAIKを使用すると、スナップショット領域を適応させることができます。あなたはノード全体を使用する必要はありませんが、これはあなたに少しのブーストを与えます。 – beatngu13

+0

あなたの考えに感謝します。実際、私は 'SnapshotParameters'をそれ以上使用していないので、削除しました。私は同じ画像の結果を得る。 ノードのサイズについては、キャンバスのサイズはノードのサイズと同じにする必要があります。そのため、スナップショット領域を指定すると、同じパフォーマンスが得られるはずです。とにかく、私はそれを試みます。 – cjpelaez

+0

最後のテスト結果を投稿するだけで、キャンバス全体のスナップショット、またはその一部だけを取ると同じパフォーマンスが得られます。それはどの地域をキャプチャしても問題ないようですが、プロセスは完了するまでに時間がかかります。 – cjpelaez

答えて

1

これは、パフォーマンスを低下させることなく、視覚的に同等の結果を得る別の方法です。

私は、JavaFXの代わりにjava.awtのクローズを使用しました。 java.awt.image.BufferedImageを作成すると、java.awt.Graphics2Dという別の方法で描画することができます。ここでの主な問題は、大きな画像を描画するにはこのライブラリを使用するのに時間がかかることですが、スケーリングされた画像を作成することができます。私の場合は、四分の一のサイズBufferedImageを作成しました。私は、その倍率を使ってすべてのオブジェクトを描画しました。その後

SwingFXUtils.WritableImage toFXImage(BufferedImage bimg, WritableImage wimg); 

を使用して、メインキャンバスに印刷:

ドロープロセスの終わりに、ちょうど使用して、javafx.scene.image.Imageに、BufferedImageを変換

graphic.drawImage(Image image, 0, 0, WIDTH, HEIGHT); 

はすべて埋めるために画像付きキャンバス。

最後に、スケール係数は設定可能なので、詳細な画像が必要な場合は、より高い値を使用してください。私には、グラデーションを描画しているので、25%のサイズのイメージで十分です。今、画像を描くのに1〜3ミリ秒かかります。これはこれまでよりもはるかに優れています。

誰かを助けることを願っています。