gpt4 book ai didi

JavaFx 与 Swing 图像可视化

转载 作者:行者123 更新时间:2023-11-30 08:09:52 28 4
gpt4 key购买 nike

我正在研究将应用程序从 Swing 传递到 JavaFx 8 是否有意义,我需要帮助。该应用程序实时显示图像,基本上我以一定的频率更新图像,例如 1 秒。图像尺寸为 28k x 4k;当我使用 JavaFx imageView 时,性能比 Swing 差。(fps 很低,大约 1-2,应用程序滞后)。我通过以下方式进行:

    animation = new Timeline();
animation.getKeyFrames().add(new KeyFrame(Duration.millis(1000), new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
for (int count = 0; count < 1; count++) {
if (indicator)
imageView.setImage(writableImage);
else
imageView.setImage(image1);
indicator = !indicator;
}
}
}));
animation.setCycleCount(Animation.INDEFINITE);

所以我尝试使用 JavaFx Canvas :

    imageCanvas.setHeight(image1.getHeight());
imageCanvas.setWidth(image1.getWidth());
imageCanvas.getGraphicsContext2D().drawImage(image1, 0, 0);

当我尝试时,出现以下错误。

java.lang.NullPointerException
at com.sun.prism.impl.BaseGraphics.drawTexture(BaseGraphics.java:400)
at com.sun.prism.impl.ps.BaseShaderGraphics.drawTexture(BaseShaderGraphics.java:139)
at com.sun.javafx.sg.prism.NGCanvas.handleRenderOp(NGCanvas.java:1336)
at com.sun.javafx.sg.prism.NGCanvas.renderStream(NGCanvas.java:1086)
at com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:595)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2067)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2067)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2308)
at com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2202)
at com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2228)
at com.sun.javafx.sg.prism.CacheFilter.impl_renderNodeToCache(CacheFilter.java:663)
at com.sun.javafx.sg.prism.CacheFilter.render(CacheFilter.java:567)
at com.sun.javafx.sg.prism.NGNode.renderCached(NGNode.java:2372)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2058)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2067)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2067)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2308)
at com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2202)
at com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2228)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2061)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2067)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2067)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:474)
at com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:320)
at com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.lang.Thread.run(Thread.java:745)

问题是由图像尺寸引起的,因为它适用于较小的图像。首先,我不明白为什么 imageView 的性能比 Swing 差这么多? (在 swing 中,我使用了一个扩展 JPanel 和 paintComponent 方法的面板。)

其次,JavaFx 中的 Canvas 大小是否有某种限制?

提前致谢。

最佳答案

为什么您的 JavaFX 应用程序不工作

28k x 4k 是一个绝对巨大的图像,JavaFX 8 不支持它直接针对硬件管道。我不知道这个限制是否在任何地方都有正式记录。

参见:Maximum dimensions of canvas in JavaFX .

默认的 JavaFX 渲染管道将尝试将图像(和 Canvas )绘制到视频卡上的纹理(用于硬件加速合成支持)。视频卡支持的纹理大小有限,通常是 2 的幂,例如 8192 x 8192。JavaFX(至少在我使用过的以前的版本中),如果您尝试渲染一个大于底层视频硬件支持的最大纹理大小的图像。

潜在的解决方法

要解决 JavaFX 中的纹理大小限制,请处理图像的传入数据并将其加载到 7 个 4k x 4k 图像中(使用带有像素写入器的可写图像)。执行此操作时,请确保输入数据以适当的 PixelFormat 编码,例如ByteBgraPreInstanceotherwise data conversion will be required这可能会极大地影响您的应用程序的性能。

JavaFX 有一些未记录的开关可以禁用硬件渲染,而是使用软件渲染管道。这些开关可能会或可能不会允许您的应用程序在不实现上述平铺算法的情况下处理大图像尺寸,但是,对于您的应用程序整体而言,保持启用硬件加速图形管道并对您的应用程序进行编码以在其中工作可能更好该管道的局限性(通过为大图像支持实现自定义平铺算法)。

性能方面

至于 JavaFX 程序与 Swing 程序的性能差异,如果没有这两个程序的源代码是不可能分析的(即使提供了源代码也可能很难分析)。所以我不会对你问题的那个方面做进一步评论。

Canvas 是比 ImageView 更复杂的控件,使用 Canvas 完成此任务不太可能比使用 ImageView 提供任何改进的性能。

关于JavaFx 与 Swing 图像可视化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32045712/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com