javascript - 尽管 requestAnimationFrame() 我的 WebGL 动画还是很慢

标签 javascript canvas webgl requestanimationframe

我正在尝试为我的网站背景创建 webgl 动画,灵感来自“Threejs - 云示例”( http://mrdoob.com/lab/javascript/webgl/clouds/ )。在我的电脑上,它看起来相当不错......但对于某些 PC 来说,它非常慢。

有没有办法进一步优化我的代码,并检测显卡是否不支持webgl?

我的动画(背景):http://wabeo.fr/?theme=auriga-7

我的代码:

var container = document.getElementById('container');
var wi       = window.innerWidth;
var he       = window.innerHeight;
var renderer  = new THREE.WebGLRenderer({
antialias: true
});
var scene    = new THREE.Scene();
var camera   = new THREE.PerspectiveCamera(75,wi/he,1,10000);
var distance = 500;
var geometry2 = new THREE.Geometry();

renderer.setSize(wi ,he);
container.appendChild(renderer.domElement);
scene.add(camera);

var texture = THREE.ImageUtils.loadTexture( '/wp-content/themes/auriga-7/i/cloud.png' );
texture.minFilter = THREE.LinearFilter;
texture.magFilter = THREE.LinearFilter;

var m = new THREE.MeshBasicMaterial( {color:0x000000} );
var material = new THREE.MeshBasicMaterial( { map: texture,transparent: true} );
var plane = new THREE.PlaneGeometry( 400,400,4,4 );


for ( ix = 0; ix <45; ix++ ) {
    item = new THREE.Mesh( plane, m );
    item.position.x = ((Math.random()-0.5)*(Math.random() * wi/2) /4)*Math.random()*10;
    item.position.y = ((Math.random()-0.5)*(Math.random() * he/2) /4)*Math.random()*10;
    item.position.z = ix*10-50;
    item.rotation.z = Math.random() *250;
    item.scale.x = item.scale.y = Math.random() * Math.random() * 2 + 0.5;

    THREE.GeometryUtils.merge(geometry2,item);
}

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

camera.position.z = distance;
camera.lookAt(scene.position);
renderer.sortObjects = false;


// create a point light
var pointLight =
  new THREE.PointLight(0xFFFFFF);

// set its position
pointLight.position.x = 10;
pointLight.position.y = 50;
pointLight.position.z = 130;

// add to the scene
scene.add(pointLight);
requestAnimationFrame(wanarender);

document.addEventListener('mousemove',onMouseMove, false);
window.addEventListener('resize',onResizeMyFuckinBrowser,false);
function onMouseMove(event){

    var mouseX = event.clientX - wi/2;
    var mouseY = event.clientY - he/2;

    camera.position.x = (mouseX - camera.position.x) * 0.02;
    camera.position.y = (-mouseY - camera.position.y) * 0.02;
    camera.position.z = distance;
    camera.lookAt(scene.position);
}
function onResizeMyFuckinBrowser(){
    var wi       = window.innerWidth;
    var he       = window.innerHeight;
    renderer.setSize(wi ,he);
}
function wanarender(){
    requestAnimationFrame(wanarender);
    renderer.render(scene, camera);
}

感谢您的帮助:-)

最佳答案

快速查看 Mr Doob 代码,我注意到一些可能对您有所帮助的优化。如果您检查 Mr Doob 的示例,您可以看到他的云纹理是 256 x 256 px 图像,而您的是 800 x 800。这里需要考虑两件事:

首先,尝试使用 2 的幂作为纹理大小,即 256、512、1024...这是因为显卡针对这些尺寸的纹理进行了优化。

其次,800 x 800 可能比您真正需要的大得多,正如 Mr Doob 演示所演示的那样。大多数时候,您的纹理会缩小到一半或更小。

Mr Doob 演示中另一件引人注目的事情是他正在使用 mipmap。 Mipmap 是指显卡以不同比例预缓存纹理的多个版本,并在任何给定时间使用最接近当前级别的版本。这使得纹理缩放更加有效,因此打开它们可能会加快速度。

您的代码:

texture.minFilter = THREE.LinearFilter;
texture.magFilter = THREE.LinearFilter;

杜布先生的代码:

texture.magFilter = THREE.LinearMipMapLinearFilter;
texture.minFilter = THREE.LinearMipMapLinearFilter;

关于 WebGL 的检测,请参阅此 Stack Overflow 答案以获取信息:

Three.js detect webgl support and fallback to regular canvas

关于javascript - 尽管 requestAnimationFrame() 我的 WebGL 动画还是很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12747896/

相关文章:

javascript - 如何停止间隔?

javascript - Hook 到 Angular-CLI 生成的应用程序的引导过程

javascript - HTML Canvas 游戏 : 2D collision detection

glsl - 从顶点着色器更新信息

javascript - javascript 的 every() 在 python 中相当于什么?

javascript - 绳索模拟html5

android - 当文本未完全在 View 内绘制时,为什么 Canvas.drawText 会变慢?

javascript - ThreeJS 创造一个太阳

javascript - 在 THREE.js 中查看 Material 的编译着色器代码?

javascript - 为 Javascript 中的单选按钮获取 true 或 false