如何在Three.js中的动画循环内运行一次函数?

时间:2017-12-11 14:41:37

标签: javascript three.js

我希望在Three.js中条件为真时运行一次函数。

我正在对FPS进行采样以发送到外部服务。对FPS进行采样和平均。当我有10个样本时,计算并发送平均值。

FPS计算的灵感来自于Stats插件到Three.js.

问题在于它会多次运行(function animate() { requestAnimationFrame(animate, renderer.domElement); var beginTime = performance.now(); // Plus some computations, raycasting etc here renderer.render(scene, camera); var endTime = performance.now(); frames ++; if (endTime > prevTime + 1000) { var fps = Math.round(frames * 1000 / (endTime - prevTime)); fpsLog.push(fps); prevTime = endTime; frames = 0; } // When fpsLog has enough values to calculate a average from, we run function if (fpsLog.length === 10) { var totalFps = 0; for (var i = 0; i < fpsLog.length; i++) { totalFps += fpsLog[i]; } var averageFps = Math.ceil(totalFps / fpsLog.length); //round up to nearest integer sendInfo(averageFps); // send fps info to external service <--- THIS ONE GETS RUN MULTIPLE TIMES (it seems like its equal to the FPS, around 56-59 times on my computer) } } ),看起来它运行的次数与FPS相同。 (当FPS = 55时,它运行55次)

我该如何避免这种情况?我只希望它拨打sendInfo()一次。

以下是我的animate()循环示例:(某些变量在外部声明)

if (fpsLog.lenght === 10)

我试图在调用 if (fpsLog.length === 10 && isExecuted === false) { var totalFps = 0; for (var i = 0; i < fpsLog.length; i++) { totalFps += fpsLog[i]; } var averageFps = Math.ceil(totalFps / fpsLog.length); //round up to nearest integer sendInfo(averageFps); // send fps info to external service <--- THIS ONE GETS RUN MULTIPLE TIMES (it seems like its equal to the FPS, around 56-59 times on my computer) isExecuted = true; } 之后设置一个布尔值,并在{{1}}中检查,但结果相同。

{{1}}

1 个答案:

答案 0 :(得分:1)

声明animate()循环之外的isExecuted变量解决了这个问题。