JavaFX 3D性能-初始渲染非常慢

JavaFX 3D性能-初始渲染非常慢,3d,javafx,3d,Javafx,我编写了一个JavaFX应用程序,它读取二进制STL文件,将数据加载到JavaFX网格中,然后将其显示为3D渲染。大部分代码取自OracleJavaFX教程中的MolecularViewer示例。我创建了一个名为STLMesh的三角形网格的新子类,它扫描STL面并相应地设置点和面数组 该代码适用于小示例:包含1000个三角形的STL文件立即出现。然而,一个包含14000个三角形的文件第一次出现需要50秒,我还有其他一些较大的示例,它们没有在合理的时间内出现。一旦进入屏幕,我可以非常平稳地旋转和平

我编写了一个JavaFX应用程序,它读取二进制STL文件,将数据加载到JavaFX网格中,然后将其显示为3D渲染。大部分代码取自OracleJavaFX教程中的MolecularViewer示例。我创建了一个名为STLMesh的三角形网格的新子类,它扫描STL面并相应地设置点和面数组

该代码适用于小示例:包含1000个三角形的STL文件立即出现。然而,一个包含14000个三角形的文件第一次出现需要50秒,我还有其他一些较大的示例,它们没有在合理的时间内出现。一旦进入屏幕,我可以非常平稳地旋转和平移显示器。我的问题是:如何避免初始渲染中的长时间延迟

下面是设置JavaFX场景图的代码——它基本上是moelcule viewer的顶级代码,但使用的是我的STLMesh类的实例,而不是分子

延迟发生在执行stage.show()之后的JavaFX线程中。其他JavaFX窗口在延迟期间没有响应。从磁盘指示灯判断,延迟期间没有明显的交换活动:它似乎是受计算限制的

我在东芝Tecra笔记本电脑上运行-我对这些机器上的图形硬件知之甚少

我尝试过Jim modelimporter,我相信它是用JavaFX实现的:它在一两秒钟内呈现我所有的STL文件。他们没有提供来源,所以我不知道他们用什么,如果有的话,聪明来避免我遇到的问题

STLviewer(File file) {
    Stage stage = new Stage();
    buildScene();
    buildCamera();
    buildAxes();

    PhongMaterial material = new PhongMaterial(Color.YELLOW);

    final Group sGroup = new Group();

    MeshView meshView = new MeshView(new STLMesh(file));
    meshView.setMaterial(material);
    // meshView.setCullFace(CullFace.NONE);
    meshView.setDrawMode(DrawMode.LINE);
    sGroup.getChildren().add(meshView);
    world.getChildren().addAll(sGroup);

    Scene scene = new Scene(root, 900, 600, true);
    scene.setFill(Color.GREY);
    handleMouse(scene, world);

    scene.setCamera(camera);
    stage.setScene(scene);
    stage.show();
}

STLMesh.java中的面数组长度太长:

旧:整数面[]=新整数[FaceCount*18]

新建:int faces[]=新建int[FaceCount*6];(每个三角形/面3个坐标+3个texCoord指数)

三角形网格的内部设置似乎“疯了”,因为三个角都有这么多三角形指向同一顶点(索引=零)

此外,texCoords的阵列应选择较短的阵列。即使未应用纹理,三角形网格也需要texCoords。在这种情况下,一个就足够了:


新:float texCoords[]={0f,0f}

您能否提供一个指向模型(和模型加载代码)的链接,以便有人尝试复制该问题?请看。我已经从应用程序中剥离了STLviewer,压缩了代码和几个STL文件,并将其放在这里:。解压内容,如果愿意的话重新编译(我也在其中放了.class文件)并作为java SimpleSTLviewer运行。呈现两个STL文件:一个小文件和一个牛奶搅拌器模型。在我的机器上,第二次渲染几乎需要一分钟。渲染后,性能非常出色。这解决了我的问题。我非常感谢InteractiveMesh。Stackoverflow是一个很好的资源。