requestAnimFrame 被多次执行
requestAnimFrame is executed multiple times
我有一个情绪检测 运行 openCV.js 用于面部检测,tensorflow.js 用于情绪分类。当我开始情绪检测时,我调用 requestAnimFrame(myProcessingLogic) 函数并将我的检测逻辑传递给回调参数。我的处理逻辑再次调用 requestAnimFrame(myProcessingLogic)。
当禁用情绪检测时,会设置一个全局变量,然后禁用对 requestAnimFrame 的递归调用。这很好用。
...但是在每次重新激活情绪检测时,都会再次调用 requestAnimFrame 调用。这会导致性能问题。
我尝试将requestAnimFrame()返回的id保存到全局,以便在检测停止时调用cancelAnimFrame(),但似乎没有效果。
第一次通话:
function startVideoProcessing() {
if (!streaming) {
console.warn("Please startup your webcam");
return;
}
canvasInput = document.createElement('canvas');
canvasInput.width = videoWidth;
canvasInput.height = videoHeight;
canvasInputCtx = canvasInput.getContext('2d');
canvasBuffer = document.createElement('canvas');
canvasBuffer.width = videoWidth;
canvasBuffer.height = videoHeight;
canvasBufferCtx = canvasBuffer.getContext('2d');
srcMat = new cv.Mat(videoHeight, videoWidth, cv.CV_8UC4);
grayMat = new cv.Mat(videoHeight, videoWidth, cv.CV_8UC1);
requestAnimId = requestAnimationFrame(processVideo);
}
处理逻辑
function processVideo() {
if(!streaming) {
return;
}
/*
logic removed to simplify
*/
requestAnimId = requestAnimationFrame(processVideo);
}
function stopEmotionTracking() {
stopCamera();
cancelAnimationFrame(requestAnimId);
requestAnimId = null;
}
我查看了 firefox 运行时分析,发现在每次重新激活时都会执行一个额外的函数调用。
我自己发现了错误。它与上面发布的代码无关。在每次开始情绪跟踪时,我都会向视频元素添加一个 EventListener。另一方面,EventListener 执行了 startVideoProcessing。由于这些事件监听器相互堆叠,因此它们被执行了多次。
对于遇到相同问题的任何人,请照顾好您的事件侦听器 ;)
我有一个情绪检测 运行 openCV.js 用于面部检测,tensorflow.js 用于情绪分类。当我开始情绪检测时,我调用 requestAnimFrame(myProcessingLogic) 函数并将我的检测逻辑传递给回调参数。我的处理逻辑再次调用 requestAnimFrame(myProcessingLogic)。
当禁用情绪检测时,会设置一个全局变量,然后禁用对 requestAnimFrame 的递归调用。这很好用。
...但是在每次重新激活情绪检测时,都会再次调用 requestAnimFrame 调用。这会导致性能问题。
我尝试将requestAnimFrame()返回的id保存到全局,以便在检测停止时调用cancelAnimFrame(),但似乎没有效果。
第一次通话:
function startVideoProcessing() {
if (!streaming) {
console.warn("Please startup your webcam");
return;
}
canvasInput = document.createElement('canvas');
canvasInput.width = videoWidth;
canvasInput.height = videoHeight;
canvasInputCtx = canvasInput.getContext('2d');
canvasBuffer = document.createElement('canvas');
canvasBuffer.width = videoWidth;
canvasBuffer.height = videoHeight;
canvasBufferCtx = canvasBuffer.getContext('2d');
srcMat = new cv.Mat(videoHeight, videoWidth, cv.CV_8UC4);
grayMat = new cv.Mat(videoHeight, videoWidth, cv.CV_8UC1);
requestAnimId = requestAnimationFrame(processVideo);
}
处理逻辑
function processVideo() {
if(!streaming) {
return;
}
/*
logic removed to simplify
*/
requestAnimId = requestAnimationFrame(processVideo);
}
function stopEmotionTracking() {
stopCamera();
cancelAnimationFrame(requestAnimId);
requestAnimId = null;
}
我查看了 firefox 运行时分析,发现在每次重新激活时都会执行一个额外的函数调用。
我自己发现了错误。它与上面发布的代码无关。在每次开始情绪跟踪时,我都会向视频元素添加一个 EventListener。另一方面,EventListener 执行了 startVideoProcessing。由于这些事件监听器相互堆叠,因此它们被执行了多次。
对于遇到相同问题的任何人,请照顾好您的事件侦听器 ;)