2014-10-06 3 views
2

Мое приложение имеет очень большой холст, содержащийся в ScrollPane.Очень большие полотна в JavaFX2

Около 10 миллионов пикселей JavaFX начинает бросать эти пустые исключения указателя во время брезентовых операций:

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) 

Я думаю, что решение должно быть виртуализировать холст. Я предполагаю, что это концептуально похоже на реализацию ListView.

Пожалуйста, указывайте мне на любые примеры, которые вы, возможно, знаете, похожие на это или на любые страницы, которые могут давать указания. (Virtual и виртуализированных не кажутся полезными для ключевых слов прибегая к помощи данной теме)

Спасибо

+1

Использовать недавний JavaFX; например В 8u20 есть некоторые исправления ошибок: [RT-36571 Включите DirectX 9Ex, чтобы избежать потери текстур при потере поверхности] (https://javafx-jira.kenai.com/browse/RT-36571). См. Соответствующую дискуссию на форуме: [Canvas Rendering Degrades пропорционально с размером?] (Https://community.oracle.com/thread/3549359) и [ControlsFX GridView] (http://controlsfx.bitbucket.org/org/controlsfx /control/GridView.html) (который, в отличие от [eppleton TileEngine] (http://jayskills.com/blog/2013/01/09/writing-a-tile-engine-in-javafx/), не является холстом конкретный). – jewelsea

+0

Это хорошие ссылки. Спасибо. –

ответ

4

Мы столкнулись с той же проблемой. Объяснения, почему это происходит, здесь: https://community.oracle.com/thread/3549359

Мы решили эту проблему, минуя видеокарту, используя следующие параметры виртуальной машины Java:

-Dprism.order=sw

Вы можете увеличить память кучи, а также с помощью - Xmx, потому что он будет использовать гораздо больше памяти.

Смежные вопросы