javascript - 在 Three.js 上渲染重型模型/网格

标签 javascript google-chrome memory three.js

我知道这是一个众所周知的问题,但我找不到好的答案。

我的使用情况

我使用 Three.js 来显示通过无人机图片创建的 3D 模型 ( here an example )。

问题

我无法渲染重型模型(1M 个顶点、2M 个面):Chrome 或 WebGl 崩溃了。

我尝试过的

我在所有测试中都使用了 Threejs.org 示例,以确保不是我的代码不起作用。我在 x64 Chrome 上使用 --max_old_space_size=6144 标志进行了测试。

  • 使用 ColladaLoader 在 .dae 中导入模型 --> 使用 2.5Go 的 RAM,Chrome 崩溃(显示“内存不足”)
  • 使用 OBJLoader + MTLLoader 在 .obj 中导入模型 --> 使用 2.8Go 的 RAM,WebGl 崩溃
  • 我红色了很多关于 Three.js 和内存分配的帖子,但其中很多都谈到从场景中删除对象

可能的解决方案

  • 我看到 .STL(二进制)文件更紧凑,但据我所知 这些文件没有纹理,所以我无法使用它
  • 使用 BinaryLoader(具有 GeometryBuffer 输出),但我需要将 .dae 或 .obj 转换为二进制文件,但我不知道该怎么做
  • 将我的模型分成多个部分加载,而不是一次加载?但我没有看到任何这样处理的示例或帖子

如何重现

对于代码,我使用 Threejs.org 上的基础示例。对于模型:

  • 如果您想尝试使用 .dae,您可以在 this folder 上找到一个工作示例(WorkingModel.dae/.jpg)和不工作的模型(BigModel.dae/.jpg)
  • 如果您想尝试使用 .obj,您可以在 this folder 上找到一个工作示例(WorkingModel.dae/.jpg/.mtl)和不工作的模型(BigModel.dae/.jpg/.mtl)

有什么想法可以加载大的吗? 谢谢!

编辑 1:

我尝试在 SuccessCallback 中放置一个断点,以查看 RAM 过载是在加载期间还是之后。我无法命中断点,因此 RAM 过载发生在 SuccessCallback 之前。

然后我在 ColladaLoader 中一步步查找到底是什么占用了这么多 RAM。这是“调用堆栈”:

  • myCollada.load()
  • ColladaLoader.parse()
  • Geometry.parse()
  • Mesh.parse()
    • Source.parse(命中 3 次)= +400mo RAM
    • Vertices.parse = +0mo 在 RAM 中
    • Triangles.parse = RAM 中 +1500mo
    • this.geometry3js.computeVertexNormals() = RAM 超过 2600Mo 并且 chrome 崩溃

我可以做其他测试来找出这个问题的原因吗? 谢谢

最佳答案

您的纹理太大了,而且您不需要它们,因为您的模型已烘焙顶点颜色,其中包括烘焙照明。因此,您的模型也不需要 UV。

使用ColladaLoader2,以及这个模式。它应该可以工作。

var loader = new THREE.ColladaLoader();

loader.load( 'BigModel.dae', function ( collada ) {

        var dae = collada.scene;

        dae.traverse( function( child ) {

            if ( child instanceof THREE.Mesh ) {

                child.geometry.removeAttribute( 'uv' ); // you don't need it

                child.material = new THREE.MeshBasicMaterial( { // scene lights not required

                    vertexColors: THREE.VertexColors // you have them, use them

                } );

                scene.add( child );
            }

        } );

} );

三.js r.86

关于javascript - 在 Three.js 上渲染重型模型/网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45209482/

相关文章:

javascript - 使用javascript将打开的对话框限制为某些文件

javascript - 在 li 的 ngFor 中,ngclass 应用于 li 标记的所有行我想应用一个特定行

javascript - 为什么这有效?清除用作表单的 javascript 对象

javascript - 使用克隆功能(jQuery)

javascript - 为什么 Javascript Eval 在不应该的时候变慢

javascript - 没有 SSL 的 Chrome 网络通知(绕过 Service Worker)

html - 如何在 Chrome 中设置背景图片?

c - C双指针重新分配错误

ios - 数组只是不断添加对象和内存崩溃

php - 从 PHP 连接到 C++ 服务器太多次导致访问冲突异常