Требуемые размеры текстуры JavaFX - PullRequest
0 голосов
/ 04 декабря 2018

Когда я пытаюсь создать очень большой многоугольник в JavaFX, чтобы использовать его с точки зрения камеры, у меня возникают проблемы с памятью GPU .Когда я пытаюсь использовать его без камеры и subcene, у меня возникает та же проблема.У меня проблема с Runtime Exception.

Java 8:

Я перешел с версии Java 8 на версию Java 11, чтобы попытаться найти какой-нибудь патч.В 8-й версии Java, в комплекте с JavaFX, я получил исключение нулевого указателя при переполнении памяти графического процессора (на моем ноутбуке 3072 МБ).

  • ширина x высота x 32 бита в МБ
  • 10000x10000x32 / 1024/1024 = 3051 МБ (ОК)
  • 11000 * 11000 * 32/1024/1024 = 3692 МБ> 3072 МБ (сбой)

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)

Простой многоугольный квадрат 11000x11000 на основе координат (0; 0; 0)

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();
    }
}

У меня есть другая проблема, когда многоугольник принадлежит Плану X, Y в 0 Z-оси.

  • Многоугольник не появляется, если многоугольник больше, чем окно в Java 11.
  • Многоугольник не появляется полностью, если многоугольник больше, чем окно в Java8.

Контекст не должен отображаться полностью

h.setTranslateZ(0);

Скриншот Java 8

enter image description here

Некоторый способ ответить

  • Запрашиваемая проблема с текстурой может быть исправлена ​​с помощью -Dprism.targetvram=2G

Расследование

Я знаю, что проблема заключается в текстурировании формы многоугольника.Но я не хочу текстурировать это.Итак, почему я не могу нарисовать большую форму многоугольника без текстуры и без сбоев.С моей стороны это плохой подход к рисованию больших многоугольников с простым цветом фона.Или архитектура JavaFX не поддерживает его.

1 Ответ

0 голосов
/ 02 января 2019

Сначала я должен заметить, что это было мое первое использование JavaFX .

Итак, я думаю, что мне не хватает знаний об этой технологии и я переоцениваю основные предложения 3D-сцены.

В чем проблема?

Я хочу нарисовать многоугольник в 3DScene с помощью 2D Polygon Class в JavaFX.Потому что легко обрабатывать события и позиции мыши с небольшим непроецированием.Более того, когда я это делаю, моя программа использует много ГРАММ / ОЗУ.

Почему?

Из-за полигона, основанного на контексте 2D-приложения JavaFX и, следовательно,создайте текстуру для обработки CSS JavaFX, так как текстура применяется к многоугольнику.Таким образом, если вы собираетесь рисовать 10k на 10k квадратного многоугольника с помощью 2D Polygon Class, вы создаете текстуру для обработки 10k на 10k пикселей, а также для памяти массива.

Заключение

Первичные 2D-фигуры не имеют формы для обработки в 3D-сцене.Например, если вы хотите написать простой 2D-конструктор чертежей с JavaFX и CameraPerspective, не используйте 2D-форму для его обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...