แอนิเมชั่น WebGL ของฉันช้าแม้จะมี requestAnimationFrame()

ฉันกำลังพยายามสร้างภาพเคลื่อนไหว webgl สำหรับพื้นหลังเว็บไซต์ของฉัน โดยได้รับแรงบันดาลใจจาก "threejs - Cloud exemple" (http://mrdoob.com/lab/javascript/webgl/clouds/) บนคอมพิวเตอร์ของฉันดูเหมือนว่าจะค่อนข้างดี... แต่สำหรับพีซีบางเครื่องมันช้ามาก

มีวิธีเพิ่มประสิทธิภาพโค้ดของฉันเพิ่มเติม และตรวจสอบว่าการ์ดกราฟิกไม่รองรับ 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);
}

ขอบคุณสำหรับความช่วยเหลือของคุณ :-)


person Willy    schedule 05.10.2012    source แหล่งที่มา
comment
สวัสดี. โปรดพิจารณาทำเครื่องหมายคำตอบว่าถูกต้อง ผู้คนบนไซต์นี้มักจะใช้เวลามากในการตอบคำถามของคุณและทำเครื่องหมายคำตอบว่าถูกต้องถือเป็นการชื่นชม นอกจากนี้ยังช่วยทำให้ไซต์ดีขึ้นด้วยการชี้แนะผู้คนไปยังข้อมูลที่ดีที่สุด ขอบคุณ.   -  person null    schedule 25.10.2012
comment
@null เขาทำไม่ได้เนื่องจากอาจยังไม่มีคำตอบที่ถูกต้อง - สิ่งที่ฉันคิดก็คือ ขึ้นอยู่กับระบบที่แอปของคุณใช้งานอยู่ คุณไม่สามารถทำอะไรได้เลยเมื่อระบบล้าสมัย   -  person Tom    schedule 20.05.2020


คำตอบ (2)


เพียงดูโค้ด Mr Doob อย่างรวดเร็ว ฉันสังเกตเห็นการเพิ่มประสิทธิภาพสองสามประการที่อาจช่วยคุณได้ หากคุณตรวจสอบตัวอย่างของ Mr Doob คุณจะเห็นว่าพื้นผิวเมฆของเขามีขนาด 256 x 256 พิกเซล ในขณะที่ของคุณมีขนาด 800 x 800 มีสองสิ่งที่ควรพิจารณาที่นี่:

ขั้นแรก ลองใช้เลขยกกำลัง 2 สำหรับขนาดพื้นผิวของคุณ เช่น 256, 512, 1024... เนื่องจากกราฟิกการ์ดได้รับการปรับให้เหมาะกับพื้นผิวที่มีขนาดเหล่านี้

ประการที่สอง 800 x 800 อาจใหญ่กว่าที่คุณต้องการจริงๆ มาก ดังที่การสาธิต Mr Doob แสดงให้เห็น โดยส่วนใหญ่ พื้นผิวของคุณจะถูกลดขนาดลงเหลือครึ่งหนึ่งหรือน้อยกว่านั้น

อีกสิ่งหนึ่งที่โดดเด่นในการสาธิต Mr Doob ก็คือเขาใช้ mipmaps Mipmaps คือเมื่อกราฟิกการ์ดแคชล่วงหน้าพื้นผิวหลายเวอร์ชันในขนาดที่แตกต่างกัน และใช้เวอร์ชันที่ใกล้เคียงที่สุดกับระดับปัจจุบันในเวลาใดก็ตาม ซึ่งจะทำให้การปรับขนาดพื้นผิวมีประสิทธิภาพมากขึ้น ดังนั้นการเปิดใช้งานอาจช่วยเร่งความเร็วให้คุณได้เล็กน้อย

รหัสของคุณ:

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

รหัสของนาย Doob:

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

เกี่ยวกับการตรวจจับ WebGL ดูคำตอบของ Stack Overflow สำหรับข้อมูล:

Three.js ตรวจพบการสนับสนุน webgl และทางเลือกสำรองไปยัง Canvas ปกติ< /ก>

person null    schedule 23.10.2012

ฉันเพิ่งเคยใช้ Three.jS มาก่อน แต่การปรับโค้ดของคุณให้เหมาะสมนั้นค่อนข้างจะมีปัญหา บางสิ่งที่ฉันได้เรียนรู้ แสดงผลก่อนที่คุณจะต่อท้ายองค์ประกอบหากคุณไม่ชอบแสงสีดำ ทำให้รูปทรงเรขาคณิตและพื้นผิวของคุณเรียบง่าย ยิ่งรูปร่างมีความซับซ้อนมากขึ้น และยิ่งมีการใช้รูปภาพเป็นพื้นผิวมากเท่าใด ก็จะยิ่งทำงานช้าลงเท่านั้น ฉันแน่ใจว่ามีวิธีเพิ่มประสิทธิภาพกราฟิก แต่ฉันยังไม่รู้ เริ่มต้นด้วยการพยายามแก้ไขปัญหานั้น

person Naman Goel    schedule 20.10.2012