在Javascript中计算小于1毫秒的FPS

时间:2013-02-21 22:37:10

标签: javascript

是否可以测量所有浏览器支持的时间间隔小于1毫秒,我只知道Chrome中的一种方式。

chrome方法:window.performance.now()

目前我在毫秒时间空间内进行FPS测量,但如果经过不到1毫秒,则得到无穷大,因为这两个数字四舍五入到最接近的毫秒,所以它们是相同的值。

是否有人知道跨浏览器功能在javascript中计算的时间间隔小于1毫秒?

3 个答案:

答案 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)