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
をキャンバスから入手する別の方法はありますか?多分別のプロセスですか?
'setFill(Paint)'にもかかわらず、 'SnapshotParameters'で何をやっていますか? AFAIKを使用すると、スナップショット領域を適応させることができます。あなたはノード全体を使用する必要はありませんが、これはあなたに少しのブーストを与えます。 – beatngu13
あなたの考えに感謝します。実際、私は 'SnapshotParameters'をそれ以上使用していないので、削除しました。私は同じ画像の結果を得る。 ノードのサイズについては、キャンバスのサイズはノードのサイズと同じにする必要があります。そのため、スナップショット領域を指定すると、同じパフォーマンスが得られるはずです。とにかく、私はそれを試みます。 – cjpelaez
最後のテスト結果を投稿するだけで、キャンバス全体のスナップショット、またはその一部だけを取ると同じパフォーマンスが得られます。それはどの地域をキャプチャしても問題ないようですが、プロセスは完了するまでに時間がかかります。 – cjpelaez