Three.js项目导致移动崩溃

狄龙·拉斐尔(Dillon Raphael)

我一直在研究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 );

}

})();
气雾

首先对您的js发表评论:typeof sneaker !== 'undefined'在请求旋转网格之前,检查是否在渲染循环中,然后再加载网格,否则会产生错误。

您的场景崩溃是因为您使用的材料太详细,例如,我可以看到4096x4096凹凸贴图。它极大地增加了桌面上的帧渲染时间,这可能是页面在移动设备上不响应的原因:片段着色器计算量太大。

但是,完全删除您花费时间的那些细节将是可耻的。您可以做的是在js中添加设备检测器。您可以使用它在台式机和移动设备上显示两种不同的模型。

但是,您可以带来更多重要的改进。由于它们是我原始帖子的一部分,所以我让他们去了:):

  1. 调整纹理大小。您使用的两个4096 x 4096 jpg为4.5MB,这很繁琐(请注意,这些年来,启用了webgl的智能手机只有500Mo RAM)。此外,您很少有任何理由可以证明这一点。您可以更改uv以减少很多没有细节的部分,并可能将图片的大小调整为512x512。最后,使用JPG压缩器将重量减少70-80%。根据您的图片,PNG也可能是更好的选择。设备的GPU内存仍然不多,如果您仍然需要提高性能,则可以在脚本中检查客户端是否支持针对GPU内存进行了优化的.pvr或.ktx纹理格式。

  2. 使您的可视化不适用于移动设备的一个重要问题是您有... 23个渲染调用,因为您使用的是15个纹理和23个几何。

这意味着,对于每一帧,您都必须在渲染最终帧之前绑定23种不同的几何形状。某些移动CPU-GPU夫妇每秒无法执行60次此操作。对于一般的移动设备,计划不要进行超过10次的渲染调用。这意味着更少的几何形状和更少的材料。合并。

我没有详细检查您的.obj文件以了解您最终如何获得23个几何图形,无论是13个纹理来自何处,最终取决于您。

当然,商店中的许多3D应用程序(OpenGL)都有超过23个对象。但是商店知道这些应用程序,他们也知道您的手机,因此他们可以执行兼容性工作并将该应用程序隐藏在低端设备上。

这里是检查场景中的渲染调用,几何形状和材质的技巧:在设置之后,在main函数renderer中的window对象中包括指向它的指针window.renderer = renderer现在,在控制台中的运行时,一旦资源加载完毕,请键入renderer.info它将在对象中返回这些数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Three.js项目导致移动崩溃

来自分类Dev

Three.js-翻译还是移动?

来自分类Dev

面向移动设备的Three.js问题

来自分类Dev

three.js前后移动球

来自分类Dev

Three.js删除项目-GridHelper

来自分类Dev

THREE.ObjectLoader的Three.js错误

来自分类Dev

Three.js:SVGRenderer?

来自分类Dev

Three.js /交集

来自分类Dev

Three.js-TransformControls

来自分类Dev

Three.JS与流

来自分类Dev

Three.js旋转

来自分类Dev

Three.js-点

来自分类Dev

Three.js-TransformControls

来自分类Dev

Three.js-平滑的阴影导致怪异的边缘

来自分类Dev

“ THREE.NearestFilter”或“ THREE.LinearFilter”导致黑平面

来自分类Dev

three.js通过鼠标向下旋转对象并移动

来自分类Dev

Three.js移动相机或两个不同的相机

来自分类Dev

three.js-灯光移动时不更新场景照明

来自分类Dev

在Three.js中沿样条线(圆)移动对象

来自分类Dev

Three.JS FPS控件左右移动

来自分类Dev

Three.js将鼠标移动限制为仅场景

来自分类Dev

Three.JS通过移动设备围绕对象旋转相机

来自分类Dev

Three.js将对象移动到相机前面

来自分类Dev

Three.js在场景的左右移动相机

来自分类Dev

Three.js转换控件-以编程方式移动

来自分类Dev

在Three.JS粒子系统中移动单个粒子

来自分类Dev

THREE.js-在从TubeGeometry构造的网格上移动纹理

来自分类Dev

Three.JS FPS控件左右移动

来自分类Dev

如何在Three.js中沿直线移动相机?