首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaFx与Swing图像可视化

JavaFx与Swing图像可视化
EN

Stack Overflow用户
提问于 2015-08-17 08:21:49
回答 1查看 668关注 0票数 2

我正在研究将应用程序从Swing传递到JavaFx 8是否有意义,我需要帮助。应用程序实时可视化图像,基本上我用一定的频率更新图像,例如1秒。图像的维数为28kx4k;当我使用JavaFx imageView时,性能比Swing差( fps低,在1-2左右,应用程序滞后)。我这样做的方式如下:

代码语言:javascript
运行
复制
    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画布:

代码语言:javascript
运行
复制
    imageCanvas.setHeight(image1.getHeight());
    imageCanvas.setWidth(image1.getWidth());
    imageCanvas.getGraphicsContext2D().drawImage(image1, 0, 0);

当我尝试它时,我会得到以下错误。

代码语言:javascript
运行
复制
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中画布的大小是否有某种限制?

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-17 20:24:19

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

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

见:JavaFX中画布的最大尺寸

默认的JavaFX呈现管道将尝试将图像(和画布)绘制到视频卡上的纹理(用于硬件加速合成支持)。视频卡在它们所支持的纹理大小上是有限的,通常是两种力量的某种力量,例如,8192 x 8192。JavaFX (至少在我以前使用过的版本中),如果您试图呈现大于底层视频硬件支持的最大纹理大小的图像,则只会引发异常。

潜在的解决办法

要解决JavaFX中的纹理大小限制,处理图像的传入数据并将其加载到7 4k x4k图像中(使用可写图像和像素写入器)。当您这样做时,请确保输入数据编码在适当的PixelFormat中,例如ByteBgraPreInstance否则,需要进行数据转换。,这可能会极大地影响应用程序的性能。

JavaFX有一些无文档的开关来禁用硬件呈现,并使用软件呈现管道代替。这些开关可能允许或可能不允许应用程序在不实现上述平铺算法的情况下处理较大的图像大小,但是,对整个应用程序来说,最好是启用硬件加速图形管道,并在该管道的限制范围内对应用程序进行编码(实现用于大型图像支持的自定义平铺算法)。

业绩方面

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

Canvas是一个比ImageView更复杂的控件,为此任务使用画布不太可能比使用ImageView提高性能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32045712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档