gpt4 book ai didi

java - 如何检测 Canvas 大小对于图形系统来说是否太大?

转载 作者:行者123 更新时间:2023-12-04 15:16:41 24 4
gpt4 key购买 nike

根据 this bug report试图创建 Canvas这对于图形系统来说太大了,仅通过转储 NullPointerException 就“悄悄地”失败了。堆栈跟踪到控制台。但是,在我的应用程序中, Canvas 大小可以基于用户输入,因此我需要检测到这一点。但是由于 NPE 被捕获在后台 JavaFX 线程中,我们不能依靠它来检测问题。知道如何从应用程序线程中以编程方式检测 Canvas 创建失败吗?
结果会因硬件而异,但足够大的大小应该可以解决问题

public class Test extends Application {

public static void main(String[] args) {
launch(args);
}

public void start(Stage stage) {
Button button = new Button("Create large canvas");
HBox hbox = new HBox(button);
button.setOnAction(e -> {
hbox.getChildren().add(new Canvas(500,50000));
// Did I get an NPE or can the Canvas render?
});
stage.setScene(new Scene(hbox));
stage.show();
}
}
在我的情况下,这导致(在控制台上可见):
java.lang.NullPointerException
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas$RenderBuf.validate(NGCanvas.java:213)
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.initCanvas(NGCanvas.java:641)
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:604)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
...

最佳答案

您需要访问有关正在使用的特定图形驱动程序和卡的信息。您可以通过对 D3D 和/或 OpenGL 进行检查来做到这一点。
我已经调试了很长时间的类似问题。在渲染管道中无法检测和处理此异常。您需要为此做好准备并规避它。
JavaFX Canvas 对象通过应用由您绘制的内容组成的纹理进行渲染。纹理的大小取决于您正在运行的特定图形硬件。您可以通过使用 VM 参数 -Dprism.verbose=true 快速读取特定系统的最大纹理大小。 “最大支持的纹理大小:x”这一行就是您要查找的内容。
以下是 DirectX 驱动程序产生的限制(信息可在 https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-limitshttps://docs.microsoft.com/en-us/windows/win32/direct3d10/d3d10-graphics-programming-guide-resources-limits 获得)
11+:16384
10: 8192
9.1:2048
9.3:4096
OpenGL 看起来更特定于硬件,可以通过调用返回限制: GetIntegerv(GL_MAX_TEXTURE_SIZE) ( https://community.khronos.org/t/what-are-the-limits-on-texture-size-for-opengl/36759 )
这些指定纹理的单个维度可以达到的最大尺寸。
您显然需要使用 D3D 和/或 OpenGL,具体取决于您正在运行的内容来获取这些内容。在 Windows 上,JavaFX 将使用 D3D,否则将使用 OpenGL。在某些情况下,您可能还需要考虑使用软件渲染。您可以通过运行 -Dprism.verbose=true 并读取最大纹理大小行的标准错误来解决此问题。
另一种方法是根据运行程序的设备的屏幕大小设置限制。根据我所看到的限制,这应该是一个非常安全的选择。为此,您可以分割为几个不同的 Canvas 对象,或者使 Canvas 的大小仅与可见区域一样大(可以使用视口(viewport)使用 ScrollPane 来完成)
如果您进行分割,我也会对总大小保持上限。如果您分割并再次遇到此异常,您可能已经用完了 vram(您可以使用 -Dprism.maxvram=amountyouwant 请求不同的数量)

关于java - 如何检测 Canvas 大小对于图形系统来说是否太大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64207627/

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