小编Dra*_*orn的帖子

使用大画布时 JavaFX 中的 NullPointers

我在我的应用程序中使用 Canvas 对象,确切地说,是 StackPane 中两个大小相同的对象。当这些对象变大时,JavaFX 在尝试绘制/渲染时开始崩溃:

java.lang.NullPointerException: Cannot invoke "com.sun.prism.RTTexture.createGraphics()" because "<local9>" is null
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas$RenderBuf.validate(NGCanvas.java:214)
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.initCanvas(NGCanvas.java:644)
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:607)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
(...)
Run Code Online (Sandbox Code Playgroud)

和类似的(都与javafx.graphics/com.sun.javafx.sg.prism.NGCanvas相关)。现在,过去已经有一些关于类似内容的讨论(例如这里),一半的互联网基本上只是通过关闭硬件加速来回答这个问题,这就是标志所做-Dprism.order=sw的。

我认为这不是答案。

我的图形硬件支持 16384x16384 纹理(至少在 OpenGL 驱动程序中)和 8GB VRAM。我什至写了一个小测试程序来验证是否是“真正的”支持,并且有效,因为我过去曾被一些糟糕的集成笔记本电脑的图形设备烧伤,该设备声称支持此兼容 OpenGL-v3,但实际上是这样的。当有人尝试分配 8k+ 纹理时崩溃。我的 PC 中只有一张显卡,因此 JavaFX 应用程序不可能使用错误的设备。

当我将画布对象的大小从 4156x4156 调整为 8252x8252 时,我的应用程序崩溃了。即使我们接受它将使用下一个更高的二次方尺寸来渲染这些东西,我也声称我的硬件应该能够处理这个设置。即使多个 16384x16384 纹理也可以轻松地与其他内容一起装入内存。

我使用的是 Windows 10,使用版本 15.0.1 的 OpenJDK 和 JavaFX,尽管 Canvas 很旧,这不应该是问题。

有谁知道这里到底发生了什么?

编辑:正如评论中所建议的,我做了一些更精确的测试。使用两个画布对象的硬编码尺寸进行进一步的手动测试揭示了以下内容:

将两者设置为 4096x4096 和 4097x4097 都有效。请记住,后者应在内部使用 8192x8192 纹理,因为这就是显卡的工作原理。内部是指在显卡上,而不是其他任何地方。

然而,这里变得有趣了:

将两个画布对象之一设置为 8192x8192(并将另一个保留为 2x2)也可以正常工作。 …

java graphics textures javafx nullpointerexception

5
推荐指数
1
解决办法
1782
查看次数

标签 统计

graphics ×1

java ×1

javafx ×1

nullpointerexception ×1

textures ×1