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

我正在使用JavaFX中的Canvas开发一个小图形引擎。 在某些时候,我必须渲染一个屏幕外图像,然后使用其GraphicContext在我的主canvas上打印它。
我现在正在使用此代码:

 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()在每次执行中花费太多时间,约14毫秒。 我需要至少以60fps更新canvas,所以这几乎消耗了我必须画的所有时间。

是否有另一种方法从canvas中获取ImageWritableImage ? 也许另一个不同的过程

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

我使用了java.awt clases,而不是JavaFX clases。 java.awt.image.BufferedImage的创建提供了获取java.awt.image.BufferedImage的可能性,您可以使用其他方法绘制。 这里的主要问题是绘制大图像会消耗大量时间使用此库,但您可以创建缩放图像。 在我的例子中,我创建了一个四分之一大小的BufferedImage ,并使用该比例因子绘制了所有对象。

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

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

然后使用以下方法在主canvas上打印:

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

用图像填充所有canvas。

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

希望它可以帮到某人。