java - 请求的纹理尺寸 JavaFX

标签 java javafx

当我尝试在 JavaFX 中创建一个非常大多边形以将其用于相机视角时,GPU 内存遇到了一些问题。当我尝试在没有相机和子场景的情况下使用它时,我遇到了同样的问题。我遇到运行时异常问题。

Java 8:

我从 Java 8 版本转到 Java 11 版本,试图找到一些补丁。在带有捆绑 JavaFX 的 Java 版本 8 中,当 GPU 内存(在我的笔记本电脑上为 3072MB)被重载时,我遇到了空指针异常。

  • 宽度 x 高度 x 32 位换算为 MB
  • 10000x10000x32/1024/1024 = 3051 MB(好的)
  • 11000*11000*32/1024/1024 = 3692MB > 3072MB(崩溃)

Java 11:

java.lang.RuntimeException: Requested texture dimensions (22022x42) require dimensions (0x42) that exceed maximum texture size (16384)

我当前的环境是 Java 11 和 JavaFX 12-ea+3。

    /usr/lib/jvm/jdk-11.0.1/bin/java --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED -javaagent:/snap/intellij-idea-ultimate/97/lib/idea_rt.jar=40539:/snap/intellij-idea-ultimate/97/bin -Dfile.encoding=UTF-8 -classpath /home/walter/amzpls/target/classes:/home/walter/.m2/repository/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar:/home/walter/.m2/repository/org/mongodb/mongo-java-driver/3.6.4/mongo-java-driver-3.6.4.jar:/home/walter/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar:/home/walter/.m2/repository/org/openjfx/javafx-controls/12-ea+3/javafx-controls-12-ea+3.jar:/home/walter/.m2/repository/org/openjfx/javafx-controls/12-ea+3/javafx-controls-12-ea+3-linux.jar:/home/walter/.m2/repository/org/openjfx/javafx-fxml/12-ea+3/javafx-fxml-12-ea+3.jar:/home/walter/.m2/repository/org/openjfx/javafx-fxml/12-ea+3/javafx-fxml-12-ea+3-linux.jar:/home/walter/.m2/repository/org/openjfx/javafx-graphics/12-ea+3/javafx-graphics-12-ea+3.jar:/home/walter/.m2/repository/org/openjfx/javafx-graphics/12-ea+3/javafx-graphics-12-ea+3-linux.jar:/home/walter/.m2/repository/org/openjfx/javafx-base/12-ea+3/javafx-base-12-ea+3.jar:/home/walter/.m2/repository/org/openjfx/javafx-base/12-ea+3/javafx-base-12-ea+3-linux.jar -p /home/walter/.m2/repository/org/openjfx/javafx-base/12-ea+3/javafx-base-12-ea+3-linux.jar:/home/walter/.m2/repository/org/openjfx/javafx-graphics/12-ea+3/javafx-graphics-12-ea+3-linux.jar ca.amzpls.app.FXMain
java.lang.RuntimeException: Requested texture dimensions (22022x22022) require dimensions (0x0) that exceed maximum texture size (16384)
    at javafx.graphics/com.sun.prism.es2.ES2RTTexture.create(ES2RTTexture.java:220)
    at javafx.graphics/com.sun.prism.es2.ES2ResourceFactory.createRTTexture(ES2ResourceFactory.java:157)
    at javafx.graphics/com.sun.javafx.sg.prism.NGShape.renderContent(NGShape.java:234)
    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)
    at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    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)
    at javafx.graphics/com.sun.javafx.sg.prism.NGSubScene.renderContent(NGSubScene.java:218)
    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)
    at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578)
    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)
    at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:479)
    at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:328)
    at javafx.graphics/com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
    at javafx.graphics/com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
    at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.RuntimeException: Requested texture dimensions (22022x22022) require dimensions (0x0) that exceed maximum texture size (16384)
    at javafx.graphics/com.sun.prism.es2.ES2RTTexture.create(ES2RTTexture.java:220)
    at javafx.graphics/com.sun.prism.es2.ES2ResourceFactory.createRTTexture(ES2ResourceFactory.java:157)
    at javafx.graphics/com.sun.javafx.sg.prism.NGShape.renderContent(NGShape.java:234)
    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)
    at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    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)
    at javafx.graphics/com.sun.javafx.sg.prism.NGSubScene.renderContent(NGSubScene.java:218)
    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)
    at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578)
    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)
    at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:479)
    at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:328)
    at javafx.graphics/com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
    at javafx.graphics/com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
    at java.base/java.lang.Thread.run(Thread.java:834)

基于坐标 (0;0;0) 的简单多边形正方形 11000x11000

import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import javafx.scene.shape.Polygon;
import javafx.stage.Stage;

public class FXMain extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {

        Box box = new Box(1500, 1500, 500);

        // init camera
        PerspectiveCamera camera = new PerspectiveCamera();
        camera.setFarClip(10000);
        camera.setTranslateZ(-1000);


        // large polygon
        Polygon h = new Polygon();
        h.getPoints().addAll(0d, 0d, 11000d, 0d, 11000d, 11000d, 0d, 11000d);
        h.setStroke(Color.RED);
        h.setStrokeWidth(10);
        h.setTranslateZ(100);

        Group root3D = new Group(box, h);

        SubScene subScene = new SubScene(root3D, 1200, 1200, true, SceneAntialiasing.BALANCED);
        subScene.setFill(Color.AQUAMARINE);
        subScene.setCamera(camera);

        BorderPane pane = new BorderPane();
        pane.setCenter(subScene);

        Scene scene = new Scene(pane);

        primaryStage.setScene(scene);
        primaryStage.setTitle("3D SubScene");
        primaryStage.show();
    }
}

当多边形属于 0 Z 轴处的 Plan X, Y 时,我遇到另一个问题。

  • 如果多边形大于 Java 11 中的窗口。
  • 如果多边形大于 Java 8 中的窗口,则多边形不会完全显示。

上下文不完全出现

h.setTranslateZ(0);

Java 8 屏幕截图

enter image description here

某种回答方式

  • 可以使用 -Dprism.targetvram=2G“修复”请求的纹理问题

调查

我知道问题出在多边形形状的纹理上。但我不想对其进行纹理处理。那么,为什么我无法在没有纹理和崩溃的情况下绘制大多边形形状。对于我来说,用简单的背景颜色绘制大多边形形状是一个糟糕的方法。或者JavaFX架构不支持。

最佳答案

首先我要注意到,这是我第一次使用 JavaFX

因此,我认为我缺乏对这项技术的了解,并且高估了 3D 场景的基本建议。

问题出在哪里?

我想使用 JavaFX 中的 2D 多边形类在 3DScene 中绘制多边形。因为只需一点点投影就可以轻松处理鼠标事件和位置。此外,当我这样做时,我的程序需要大量的 GRAM/RAM。

为什么?

由于Polygone基于2D JavaFX应用程序上下文,因此创建了一个纹理来处理JavaFX CSS,就像纹理应用于多边形一样。因此,如果您希望通过 2D 多边形类绘制 10k x 10k 正方形多边形,则需要创建一个纹理来处理 10k x 10k 像素以及数组内存。

结论

原色 2D 形状无法在 3D 场景中处理。例如,如果您想使用 JavaFX 和 CameraPerspective 编写一个简单的 2D 蓝图生成器,请不要使用 2D 形状来处理它。

关于java - 请求的纹理尺寸 JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53617869/

相关文章:

javafx - 在 FXML 中将 RadioMenuItem 添加到 ToggleGroup

java - 在 Java 中将多行字符串强制转换为 List<String>

java处理大文本文件的有效方法

java - 在java中读取一行然后对其进行标记

c# - 从头开始的模型- View - Controller 架构最佳实践

java - 无法使用 Confluence Schema Registry 和 Spring Cloud Stream 反序列化 Avro 消息

java - 在单独的 JavaFX 线程中排队打印作业

java - 传递字符串对象时使用 apache poi 格式化日期

JavaFX - 将阶段大小绑定(bind)到根节点的首选大小

java - 任务只运行一次