JavaFX上Canvas.snapshot()的替代方法

cjpelaez

我正在开发CanvasJavaFX中使用的图形引擎在某些时候,我必须渲染一个屏幕外图像,然后使用将该图像打印在我的主画布上GraphicContext
我现在正在使用此代码:

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

我的问题是该方法snaphot()在每次执行中花费太多时间,约14ms。我至少需要以60fps的速度更新画布,所以这几乎消耗了我绘制的所有时间。

还有另一种获取画布ImageWritableImage从画布获取的方法吗?也许另一个不同的过程?

cjpelaez

这是在不降低性能的情况下获得视觉等效结果的另一种方法。

我使用了java.awtclase,而不是JavaFX clase。创建ajava.awt.image.BufferedImage的可能性使java.awt.Graphics2D您可以使用其他方法进行绘制。这里的主要问题是使用此库绘制大图像会花费大量时间,但是您可以创建缩放图像。就我而言,我创建了一个Quarter-size BufferedImage,并使用该比例因子绘制了所有对象。

在绘制过程结束时,只需使用将转换为BufferedImage即可javafx.scene.image.Image

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

然后使用以下命令将其打印在主画布上:

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

用图像填充所有画布。

最后,比例因子是可配置的,因此,如果您需要详细的图像,请使用更高的值。对我来说,一张25%的图像就足够了,因为我正在绘制渐变。现在,绘制图像需要1-3ms,这比以前要好得多。

希望它能帮助某人。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章