当我尝试在JavaFX中创建一个非常大的大多边形并用于相机视角时,我在 GPU内存上遇到了一些麻烦。当我尝试在没有相机和子场景的情况下使用它时,我遇到了同样的问题。我对运行时异常有疑问。
Java 8:
我从Java 8版本转到Java 11版本,试图找到一些补丁。在Java版本8中,与捆绑的JavaFX一起使用时,当我的笔记本电脑上的GPU内存超过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)的简单Polygone正方形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时,我还有另一个问题。
上下文不能完全显示
h.setTranslateZ(0);
Java 8屏幕截图
某种回答方式
-Dprism.targetvram=2G
进行“修复” 调查
我知道问题在于多边形的纹理化。但我不想对其进行纹理处理。所以,为什么我不能在没有纹理且没有崩溃的情况下绘制大的多边形。对于我来说,用简单的背景色绘制大的多边形形状是一种不好的方法。或JavaFX架构不支持它。
答案 0 :(得分:0)
首先,我要注意到,这是我第一次使用JavaFX 。
因此,我认为我对这种技术的了解不足,并且高估了3D场景的基本建议。
问题出在哪里?
我想用JavaFX中的2D多边形类在3DScene中绘制一个多边形。因为只需一点点投影就可以轻松处理鼠标事件和位置。而且,当我这样做时,我的程序需要大量的GRAM / RAM。
为什么?
由于基于2D JavaFX应用程序上下文的Polygone并因此创建了一个纹理来处理JavaFX CSS,因为纹理应用于多边形。因此,如果您希望通过2D多边形类绘制10k x 10k正方形多边形,则可以创建一个纹理来处理10k x 10k像素以及数组内存。
结论
原始2D形状没有要在3D场景中处理的形状。例如,如果要使用JavaFX和CameraPerspective编写简单的2D蓝图构建器,则不要使用2D形状来处理它。