Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript设置超时性能与手动检查_Javascript_Performance_Webgl_Settimeout - Fatal编程技术网

Javascript设置超时性能与手动检查

Javascript设置超时性能与手动检查,javascript,performance,webgl,settimeout,Javascript,Performance,Webgl,Settimeout,我正在编写一个WebGL游戏,我很好奇通过检查是否在每次更新requestAnimationFrame(使用Date.now())或通过设置超时(使用setTimeout())时发生事件来实现我的游戏事件是否会更好地提高性能 请注意,这些事件通常相隔约100ms 我主要担心的是,setTimeout在空闲时(等待下一个事件)不会浪费CPU,如果我在每次更新时都进行检查,我将进行如果我使用setTimeout就不会发生的计算,我相信正确的做法是使用 如果您已经在requestAnimationF

我正在编写一个WebGL游戏,我很好奇通过检查是否在每次更新
requestAnimationFrame
(使用
Date.now()
)或通过设置超时(使用
setTimeout()
)时发生事件来实现我的游戏事件是否会更好地提高性能

请注意,这些事件通常相隔约100ms


我主要担心的是,
setTimeout
在空闲时(等待下一个事件)不会浪费CPU,如果我在每次更新时都进行检查,我将进行如果我使用setTimeout就不会发生的计算,我相信正确的做法是使用


如果您已经在requestAnimationFrame中,我认为最好检查当前时间和任何挂起的事件,基本上做您能做的任何工作


setTimeout
需要一些非常类似于上下文切换的东西,这是一种不必要的开销,当然,如果事件导致屏幕更新,那么您要么“现在”进行更新,要么安排在下一个requestAnimationFrame中进行更新,这两者都是不必要的复杂性。

如果您需要事件,创建和使用eventListeners

如果您需要在每次调用rAF时检查条件是否已更改以执行某些操作,只需在rAF循环中进行检查

注意:您不需要而且应该避免在每次调用时创建新的日期对象;有一个时间戳作为请求函数的唯一参数通过rAF传递,请使用此参数

function update(timestamp){...};   
requestAnimationFrame(update);
以高速率使用setTimeout只会对timedout函数进行无用的调用,该函数将被推到要执行的任务堆栈的顶部


在rAF循环的顶部嵌入检查也同样好

我很抱歉造成混淆(如果有)。我已经更新了我的问题。我正在使用requestAnimationFrame进行绘图。问题是我应该手动检查同一更新周期中的事件,还是设置超时。(以及原因)如果由事件引起的更改会更改对象的状态。此状态将更改对象在下次更新时的渲染方式。(不需要附加逻辑)但我理解你的观点。我主要担心的是,setTimeout在空闲时(等待下一个事件)不会浪费cpu,如果我在每次更新时检查事件,我将浪费cpu。当然,我同意使用RAF,但我对以下语句感到困惑:
setTimeout
包含非常类似于上下文切换的内容。RAF和setTimeout都使用回调,所以它们在“上下文切换”方面的行为没有本质区别,不管你是什么意思。不同之处在于RAF更精确,并且在浏览器的工作流期间在最佳时间调用。setTimeout(与Date.now()相反,而不是RAF)必然需要将控制权从浏览器的内部函数返回到其Javascript解释器,因此类似于上下文切换。我不知道这到底有多贵,但它不能比不这样做便宜。这就是
requestAnimationFrame
发明的目的。每次调用时所做的检查(通常,自上次调用后经过了一定的毫秒数)将花费几微秒。您正在检查的是这些“事件”吗?