2016-03-23 1 views
0

J'ai une scène qui contient 15-20 objets, 4 lumières. Et les propriétés de mon moteur de rendu sontOptimiser le temps de rendu Three.JS pour une scène statique

function getRenderer(container, width, height) { 
    var renderer; 

    renderer = new THREE.WebGLRenderer({ alpha: false, antialias: true, preserveDrawingBuffer: false }); 
    renderer.setPixelRatio(window.devicePixelRatio); 
    renderer.setSize(width, height); 
    container.appendChild(renderer.domElement); 
    renderer.shadowMapEnabled = true; 
    renderer.shadowMapType = THREE.PCFSoftShadowMap; 
    renderer.setClearColor(new THREE.Color(0xCCE0FF), 1); 
    renderer.gammaInput = true; 
    renderer.gammaOutput = true; 
    renderer.clear(); 

    return renderer; 
} 

Ma boucle de rendu restitue la scène toutes les secondes.

function renderLoop() { 
    this.renderer.render(this.scene, this.camera); 
    setTimeout(function() { 
     renderLoop(); 
    }, 1000); 
} 

Le problème que je suis confronté est this.renderer.render(this.scene, this.camera) est de prendre environ 100 ms pour rendre la scène mais je veux que ce soit ci-dessous 33ms pour que je puisse avoir la fréquence d'images d'au moins 30 images par seconde.

Existe-t-il un moyen d'optimiser les performances du moteur de rendu par n'importe quel moyen (comme changer des propriétés ou quelque chose)?

Je ne veux pas utiliser worker.js car ma scène est statique et ne contient aucun calcul complexe.

+1

d'abord toute utilisation [ requestAnimationFrame] (https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame) au lieu de setTimeout. Deuxièmement, utilisez [BufferGeometry] (http://threejs.org/docs/#Reference/Core/BufferGeometry) au lieu de [Geometry] (http://threejs.org/docs/#Reference/Core/Geometry) –

+0

Un autre conseil est de fusionner vos géométries. –

+0

Peut-être que vous pouvez essayer de rendre uniquement ce qui est visible. Check this out: [ThreeJS désactiver le rendu des visages derrière la caméra] (http://stackoverflow.com/questions/26056352/threejs-disable-rendering-of-faces-behind-the-camera) – leota

Répondre

1

Si vous avez une scène statique, il n'y a pas de raison d'avoir une boucle d'animation. Vous avez juste à rendre une fois après la scène - et tous vos biens - charger. C'est pourquoi il existe des rappels pour les fonctions du chargeur. C'est ce qui explique pourquoi il y a des rappels pour les fonctions du chargeur. Et c'est pourquoi il y a un THREE.LoadingManager.

Il existe de nombreux cas d'utilisation possibles. Étudiez les exemples de three.js pour trouver des solutions pour votre cas d'utilisation particulier.

Si vous utilisez OrbitControls pour contrôler la caméra, vous pouvez forcer une réengendrer chaque fois que la caméra se déplace, comme ceci:

controls = new THREE.OrbitControls(camera, renderer.domElement); 
controls.addEventListener('change', render); // use if there is no animation loop 

Three.js R.75

+0

Actuellement, ma scène est statique mais je dois ajouter du mouvement plus tard, si la scène statique prend plus de temps à restituer alors la scène avec mouvement prendra beaucoup plus de temps, donc j'essaye de fixer le temps de rendu .Logique? – Nischal