Very strange behaviour in JavaScript, a simple AnimationMixer.update(delta)
doesn't work unless I console.log it:
// This works
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
// Update mixers...
Object.values(sandbox.models).forEach(x => (x.mixer && console.log(x.mixer.update(clock.getDelta()))));
}
// These don't work
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
// Update mixers...
Object.values(sandbox.models).forEach(x => (x.mixer && (x.mixer.update(clock.getDelta()))));
}
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
// Update mixers...
Object.values(sandbox.models).forEach(x => (x.mixer && void(x.mixer.update(clock.getDelta()))));
}
Then, when playing the animation by AnimationMixer.clipAction(animation).play()
does not play unless I do the first one.
This is very strange, why does the mixer only update when logged the return value?
I can't show all the code because it's too long and won't work because I have linked files too.
And as you may know you can't log thousands of times per second, it's stupid in general and will slow down the game.
CodePudding user response:
You should never call Clock.getDelta()
more than once in your animation loop. Otherwise the delta values will be near 0
(since you get the elapsed time between the last getDelta()
call). So try it like so:
function animate() {
requestAnimationFrame(animate);
const delta = clock.getDelta();
renderer.render(scene, camera);
// Update mixers...
Object.values(sandbox.models).forEach( x => {
if (x.mixer) x.mixer.update(delta);
} );
}
Also avoid the usage of Object.values()
per frame since it will return a new array on each invocation which is bad for performance (this just leads to GC overhead).