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中获取Image
或WritableImage
? 也许另一个不同的过程
这是获得视觉等效结果而不降低性能的另一种方法。
我使用了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,这比以前好多了。
希望它可以帮到某人。