JavaFX2中的超大画布 [英] Very large canvases in JavaFX2

查看:93
本文介绍了JavaFX2中的超大画布的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序的ScrollPane包含一个非常大的Canvas。

My application has a very large Canvas contained by a ScrollPane.

在大约1000万像素的情况下,JavaFX开始在画布操作期间抛出这些空指针异常:

At about 10 million pixels JavaFX starts throwing these null pointer exceptions during canvas operations:

at com.sun.javafx.sg.prism.NGCanvas$RenderBuf.validate(Unknown Source)
at com.sun.javafx.sg.prism.NGCanvas.initCanvas(Unknown Source)
at com.sun.javafx.sg.prism.NGCanvas.renderContent(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.BaseNode.render(Unknown Source)
at com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
at com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.BaseNode.render(Unknown Source)
at com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
at com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.renderForClip(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.renderRectClip(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.renderClip(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.BaseNode.render(Unknown Source)
at com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
at com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.BaseNode.render(Unknown Source)
at com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.BaseNode.render(Unknown Source)
at com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
at com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
at com.sun.javafx.sg.BaseNode.render(Unknown Source)
at com.sun.javafx.tk.quantum.ViewPainter.doPaint(Unknown Source)
at com.sun.javafx.tk.quantum.AbstractPainter.paintImpl(Unknown Source)
at com.sun.javafx.tk.quantum.PresentingPainter.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
at com.sun.prism.render.RenderJob.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

我认为解决方案必须是虚拟化Canvas。我想这在概念上类似于ListView的实现方式。

I think the solution must be to virtualize the Canvas. I imagine this is conceptually similar to how ListView is implemented.

请向我指出您可能知道的与此示例相似的任何示例,或可能提供指导的任何页面。 (虚拟化和虚拟化似乎并不是搜索此主题的有用关键字)

Please point me to any examples you may know of that are similar to this or any pages that may provide guidance. (Virtual and virtualized don't seem to be helpful keywords for googling this topic)

谢谢

推荐答案

我们遇到了同样的问题。
发生这种情况的解释在这里: https://community.oracle.com/thread/ 3549359

We faced the same problem. The explanation why it happens, is here: https://community.oracle.com/thread/3549359

我们使用以下JVM参数解决了绕过视频卡的问题:

We solved the problem bypassing the video card, using the following JVM parameter:

-Dprism.order = sw

您可能还希望使用-Xmx来增加堆内存,因为它将使用更多的内存。

You may want to increase heap memory as well using -Xmx because it will use much more memory.

这篇关于JavaFX2中的超大画布的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆