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

时间:2014-10-07 21:56:52

标签: 3d javafx

我编写了一个Java FX应用程序,它读取二进制STL文件,将数据加载到JavaFX网格中,然后将其显示为3D渲染。大多数代码都来自Oracle JavaFX教程中的分子查看器示例。我创建了一个名为STLMesh的TriangleMesh的新子类,它在STL方面进行扫描并相应地设置点和面数。

该代码适用于小例子:具有1000个三角形的STL文件立即出现。但是,一个只有不到14,000个三角形的文件首次出现需要50秒,而我还有其他较大的例子,这些例子在合理的时间内没有出现。一旦进入屏幕,我就可以非常顺利地旋转和平移显示屏。我的问题:如何避免初始渲染中的这种长时间延迟?

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

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

我在Toshiba Tecra笔记本电脑上运行 - 我对这些机器上的图形硬件了解不多。

我已经尝试过来自http://www.interactivemesh.org/models/jfx3dimporter.html的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();
}

1 个答案:

答案 0 :(得分:3)

STLMesh.java中face-array的长度太长:

old:int faces [] = new int [facetCount * 18];

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

似乎TriangelMesh的内部设置很疯狂'由于这么多三角形指的是所有三个角的相同顶点(索引=零)。

此外,应该选择较短的texCoords数组。即使没有应用纹理,TriangleMesh也需要texCoords。在这种情况下,单个就足够了:

new:float texCoords [] = {0f,0f};