6

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

镀铬方法:window.performance.now()

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

有谁知道跨浏览器函数在 javascript 中计算小于 1 毫秒的时间间隔?

4

3 回答 3

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 倍。显然你会想要稍微调整一下。如果您读取一半时间 1 毫秒和一半时间 0 毫秒的持续时间(使用 1 毫秒分辨率计时器),这将允许您读取徘徊在 0.5 毫秒左右的平均值。

这显然不能替代适当的更高分辨率计时器。但是我使用这个简单的算法来给我的 javascript 项目一个非蹩脚的 FPS 读数。你会得到一个阻尼因子,你可以根据你是想要更准确还是更直接地响应变化来调整它。考虑到这一点的简单性,您将很难找到一种更优雅的算法来为您提供良好的表示,而无需任何改进的输入数据。增强它的方法之一是根据采样本身的频率(如果发生变化)调整接近因子(即 0.02 常数),这样可以使较慢的测量速率比固定值更快地收敛.

于 2013-02-22T02:45:48.193 回答
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();
}

PS 刚刚在此处输入,未经测试,可能需要稍作更改。

我记得在lwjgl教程中看到过这样的方法......

也正如@StevenLu 所指出的,您可以修改它以计算 0.5 秒内的帧数并将“fps”乘以 2,甚至更短的时间(例如 0.25 秒),以便更频繁地更新 fps 值.

于 2013-02-22T03:15:40.170 回答
0

Chrome 20 中提供了高分辨率时间,但您应该知道,JS 中的时间分辨率取决于浏览器、设备和环境。它可能在 4ms 和 1000+ms 之间变化

于 2013-02-21T22:50:01.077 回答