是否可以测量所有浏览器支持的时间间隔小于1毫秒,我只知道Chrome中的一种方式。
chrome方法:window.performance.now()
目前我在毫秒时间空间内进行FPS测量,但如果经过不到1毫秒,则得到无穷大,因为这两个数字四舍五入到最接近的毫秒,所以它们是相同的值。
是否有人知道跨浏览器功能在javascript中计算的时间间隔小于1毫秒?
答案 0 :(得分:3)
如果没有准确的计时器,您可以获得准确的测量结果,只要您经常进行计时,我希望他们能够做到这一点。
平均/汇总事件持续时间的不精确测量值。我的一个项目的片段:
var start = Date.now();
... (stuff to be timed)
var now = Date.now();
if (DEBUG.enabled) {
var profile_this_iter = now - start;
profile += (profile_this_iter - profile) * 0.02;
}
每个新值测量都会使您的读数更接近0.02倍。显然你会想要调整一下。如果您读取持续时间为1ms的一半时间和0ms的一半时间(使用1ms分辨率计时器),这将允许您读取徘徊在0.5ms左右的平均值。
这显然不能替代适当的高分辨率计时器。但是我使用这个简单的算法为我的javascript项目提供了一个非常糟糕的FPS阅读。您将获得一个阻尼因子,您可以调整,具体取决于您是否需要更准确或更快速地响应更改。考虑到这一点的简单性,您很难找到更优雅的算法来为您提供良好的表示,而无需任何改进的输入数据。增强它的方法之一是根据采样频率(如果发生变化)调整接近因子(0.02常数),这样可以使得较慢的测量速率比固定值更快地收敛。
答案 1 :(得分:1)
实际上还有另一种计算fps的方法,可能可以解决这个问题。 计算第二个中的实际帧数,我认为应非常准确。
var fpsStart = new Date().getTime();
var fpsCounting = 0;
var fps = 0;
start_the_first_frame();
// Loop
function update(){
do_time_consuming_stuff();
fpsCounting++;
var thisFrame = new Date().getTime();
if(thisFrame - fpsStart >= 1000){
fpsStart += 1000;
fps = fpsCounting;
fpsCounting = 0;
}
request_next_animation_frame();
}
P.S。只是在这里输入,未经测试,可能需要稍作修改。
我记得在lwjgl教程中看到过这样的方式...
同样如@StevenLu所述,您可以修改它以计算0.5秒内的帧数并将“fps”乘以2,甚至更短的时间(例如0.25秒),以便更新fps值更频繁。
答案 2 :(得分:0)
High resolution time is available in Chrome 20,但你应该知道,time resolution in JS depends on the browser, device and circumstances。它可能在4ms到1000 + ms之间变化