我希望在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}}
答案 0 :(得分:1)
声明animate()循环之外的isExecuted变量解决了这个问题。