我一直在研究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中添加设备检测器。您可以使用它在台式机和移动设备上显示两种不同的模型。
但是,您可以带来更多重要的改进。由于它们是我原始帖子的一部分,所以我让他们去了:):
调整纹理大小。您使用的两个4096 x 4096 jpg为4.5MB,这很繁琐(请注意,这些年来,启用了webgl的智能手机只有500Mo RAM)。此外,您很少有任何理由可以证明这一点。您可以更改uv以减少很多没有细节的部分,并可能将图片的大小调整为512x512。最后,使用JPG压缩器将重量减少70-80%。根据您的图片,PNG也可能是更好的选择。设备的GPU内存仍然不多,如果您仍然需要提高性能,则可以在脚本中检查客户端是否支持针对GPU内存进行了优化的.pvr或.ktx纹理格式。
使您的可视化不适用于移动设备的一个重要问题是您有... 23个渲染调用,因为您使用的是15个纹理和23个几何。
这意味着,对于每一帧,您都必须在渲染最终帧之前绑定23种不同的几何形状。某些移动CPU-GPU夫妇每秒无法执行60次此操作。对于一般的移动设备,计划不要进行超过10次的渲染调用。这意味着更少的几何形状和更少的材料。合并。
我没有详细检查您的.obj文件以了解您最终如何获得23个几何图形,无论是13个纹理来自何处,最终取决于您。
当然,商店中的许多3D应用程序(OpenGL)都有超过23个对象。但是商店知道这些应用程序,他们也知道您的手机,因此他们可以执行兼容性工作并将该应用程序隐藏在低端设备上。
这里是检查场景中的渲染调用,几何形状和材质的技巧:在设置之后,在main函数renderer
中的window对象中包括指向它的指针window.renderer = renderer
。现在,在控制台中的运行时,一旦资源加载完毕,请键入renderer.info
。它将在对象中返回这些数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句