Java2D与Javafx Canvas性能比较

4
我正在开发一个Java程序,它可以在屏幕上绘制复杂的分形图形,并允许用户“缩放”和移动以探索这些形状。这意味着必须进行计算才能显示分形图形,并且必须达到一定的帧率(约为20 fps或更高)。
我有几种方法可以实现这一点,但我想知道哪种方法具有最佳性能。
首先,我考虑使用一个空白的Image(具体来说是BufferedImage)及其Graphics2D上下文在屏幕外绘制分形图形,然后将其传递给UI,由UI将其绘制到屏幕上。这意味着需要创建大量的Image类型,这可能会占用很多内存。
类似的选择是创建两个图像,然后在显示第一个图像的同时在第二个图像上绘制,反之亦然。这种方法会产生更好的性能吗?
我的第三个选择是使用JavaFX的Canvas API,而不是Image,在本质上做相同的事情(离屏绘制)。
哪种方法会给我最好的结果?或者还有其他需要考虑的因素吗?
谢谢
1个回答

3
我用JavaFX编写了一个非动画的分形生成器。我使用了WritableImage和对其PixelWriter的setColor的调用。我在一个Task中生成了WritableImage,并从Task的call方法中返回了Image;然后我只需用生成的图像更新ImageView的图像即可。另一个选项是在Task中生成颜色,作为int或byte数组,并通过调用setPixels()方法将它们批量复制到单个WritableImage中。我认为这两种方法都能很好地执行。
据我所知,JavaFX中的Canvas缓存其绘图命令,然后在呈现时执行所有命令;我认为这不会表现得很好。但我可能错了。

你知道在一个任务和用户界面之间传递两个可写图像比总是重新实例化一个更好吗? - user3236471
1
我认为创建WritableImage的成本相对于计算像素数据的成本来说是非常微不足道的,因此我怀疑这样做是否会有任何区别。如果它确实表现更好,那么我认为使用单个WritableImage并让任务计算int或byte数组将同样表现良好,并且可能会使代码更清晰。也许你需要进行一些实验... - James_D
你正在使用一个Task,因此GUI线程必须与已执行该任务的线程同步:它可能需要很长时间来等待(足够可见),这可能会导致动画出现延迟或非线性(有时快有时慢)。我认为最好使用Canvas,结果会更加平滑。 - zenbeni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接