我正在开发一个小型图形引擎Canvas
在JavaFX中。在某些时候,我必须渲染离屏图像,然后使用其将其打印在我的主画布上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()
每次执行花费太多时间,约 14 毫秒。我需要至少以 60 fps 的速度更新画布,因此这几乎消耗了我必须绘制的所有时间。
还有其他方法可以获取Image
or WritableImage
从画布上?也许是另一个不同的过程?
这是另一种获得视觉等效结果而不降低性能的方法。
我用过java.awt
类,而不是 JavaFX 类。创建一个java.awt.image.BufferedImage
提供了获得的可能性java.awt.Graphics2D
您可以在其中使用其他方法进行绘制。这里的主要问题是使用这个库绘制大图像会消耗大量时间,但您可以创建缩放图像。就我而言,我创建了四分之一尺寸的BufferedImage
,并且我已经使用该比例因子绘制了所有对象。
在绘制过程结束时,只需转换BufferedImage
, to a javafx.scene.image.Image
, using:
SwingFXUtils.WritableImage toFXImage(BufferedImage bimg, WritableImage wimg);
然后使用以下命令将其打印在主画布上:
graphic.drawImage(Image image, 0, 0, WIDTH, HEIGHT);
用图像填充整个画布。
最后,比例因子是可配置的,因此如果您需要详细的图像,只需使用更高的值即可。对我来说,25% 大小的图像就足够了,因为我正在绘制渐变。现在,绘制图像只需 1-3ms,这比以前好多了。
希望它能帮助某人。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)