Three.js项目在移动设备上崩溃

3
我正在进行一个three.js项目,以尝试学习这个框架。有一个基本的模型在桌面浏览器上可以正常工作,但在移动设备上会反复崩溃。我将项目上传到了我的服务器http://threedeesneaker.404vanity.com/ 有没有办法优化它以适应移动设备?我已经尝试了iPhone和iPad的Chrome和Safari。
代码本身:
(function() {

var scene, camera, renderer;
var geometry, material, mesh, sneaker;

init();
animate();

function init() {

    scene = new THREE.Scene();
    var WIDTH = window.innerWidth,
        HEIGHT = window.innerHeight;

        var ambient = new THREE.AmbientLight( 0x444444 );
                scene.add( ambient );

    camera = new THREE.PerspectiveCamera( 3, WIDTH / HEIGHT, 1, 20000 );
    camera.position.z = 1000;



    window.addEventListener('resize', function() {
      var WIDTH = window.innerWidth,
          HEIGHT = window.innerHeight;
      renderer.setSize(WIDTH, HEIGHT);
      camera.aspect = WIDTH / HEIGHT;
      camera.updateProjectionMatrix();
    });

    geometry = new THREE.BoxGeometry( 200, 200, 200 );
    material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } );

    mesh = new THREE.Mesh( geometry, material );
    scene.add( mesh );


    // prepare loader and load the model
    var oLoader = new THREE.OBJMTLLoader();
    oLoader.load('models/sneaker.obj', 'models/sneaker.mtl', function(object) {

      object.scale.set(1, 1, 1);
      object.rotation.y = 600;
      object.rotation.z= 600;
      sneaker = object;
      scene.add(sneaker);
    });


  // var loader = new THREE.OBJLoader();
  // loader.load('models/sneaker.obj', function(object) {
  //   sneaker = object;
  //   sneaker.scale.set(1,1,1);
  //   sneaker.rotation.y = 600;
  //   sneaker.rotation.z= 600;
  //   scene.add(sneaker);

  // });





    renderer = new THREE.WebGLRenderer();
    renderer.setSize( WIDTH, HEIGHT );

    renderer.setClearColor(0x333F47, 1);


    var light = new THREE.PointLight(0xffffff);
    light.position.set(-100,200,100);
    scene.add(light);

    document.body.appendChild( renderer.domElement );

}

function animate() {

    requestAnimationFrame( animate );

    mesh.rotation.x += 0.01;
    mesh.rotation.y += 0.02;
    sneaker.rotation.x += 0.01;
    sneaker.rotation.y += 0.02;


    renderer.render( scene, camera );

}

})();
1个回答

5
首先,关于您的js的评论:在渲染循环中,在请求旋转网格之前,请检查typeof sneaker!==“undefined”,在加载它之前会生成错误。
您的场景崩溃是因为您使用了过于详细的材质,例如我可以看到一个4096x4096的凸起贴图。这会大大增加桌面帧渲染时间,并可能是页面在移动设备上不响应的原因:片段着色器计算变得太大。
然而,完全删除您花费时间的这些细节将是一种遗憾。您可以做的是在js中添加设备检测器。您可以使用它在桌面和移动设备上显示两个不同的模型。
但是,您可以带来更重要的改进。由于它们是我的原始帖子的一部分,所以我把它们留在那里 :):
1.调整纹理大小。您正在使用两个4.5MB的4096 x 4096 jpg,这很重要(请注意,现在有仅具有500Mo RAM的启用webgl的智能手机)。此外,您只有很少的细节可以证明它。您可以更改uv以大大减少没有细节的部分,并可能将图片调整为512x512。最后,使用JPG压缩器可以将重量减少70-80%。根据您的图片,PNG也可能是更好的选择。设备的GPU内存仍然是另一回事,如果您仍然需要提高性能,则可以在脚本中检查客户端是否支持.pvr或.ktx纹理格式,这些格式针对GPU内存进行了优化。
2.一个重要的问题使您的可视化对移动设备不适当,即您有... 23个渲染调用,因为您使用了15个纹理和23个几何体。
这意味着,对于每个帧,您将不得不在最终帧渲染之前绑定23个不同的几何体。一些移动CPU-GPU夫妇无法每秒执行60次。不要为平均移动设备计划超过10个渲染调用。这意味着较少的几何体和较少的材质。合并。
我没有详细检查您的.obj文件以了解最终如何获得23个几何体,也没有了解您的13个纹理来自何处,由您决定。
当然,商店中有很多3D应用程序(OpenGL)拥有超过23个对象。但是商店知道应用程序并且他们知道您的手机,因此他们可以执行兼容性工作并将应用程序隐藏到低设备。
以下是检查场景中的渲染调用,几何体和材料的提示:在设置了renderer之后,在您的主函数中,将指针包含在window对象window.renderer = renderer中。现在在运行时在控制台中,一旦资源已加载,请键入renderer.info。它将以对象形式返回这些数据。

好总结!对于移动GPU来说,这是大量的几何和纹理数据需要处理,尤其是将其尽可能地减少应该会有很大帮助。目前它所处的细节水平在移动设备上表现不佳。 - undefined
哇,谢谢。有些很棒的信息。对于第三点,应该如何解决这个情况最好呢? - undefined
@DillonRaphael 我删除了有关 2Mo 几何图形的部分,这在移动设备上并不是一个限制因素。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接