IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 组件:c语言2幂采样平均帧率统计 -> 正文阅读

[数据结构与算法]组件:c语言2幂采样平均帧率统计

背景介绍

帧率统计常用于游戏限帧,视频音画同步等地方。是时间类组件的重要部分。

基本思路

1.2幂长度的环形缓存区能便于计算。
2.每帧采样并计算帧间间隔填入缓存区。
3.每帧都利用统计的帧缓冲计算平均帧率。

使用这种方式,每一帧都能得到正确的平均帧率,仅计算进出缓冲的时间间隔效率高。

1.最终使用案例

https://bitbucket.org/mm_longcheng/mm-core/src/dev/mm/src/core/mmFrameStats.h

static void MyTestFrameStats(void)
{
    int i;

    struct mmFrameStats stats;

    mmFrameStats_Init(&stats);

    // 可选,设置初始帧率
    mmFrameStats_SetAverage(&stats, 60.0);

    for (i = 0; i < 60; i++)
    {
        // 休眠一段时间
        mmMSleep(16);

        // 更新帧率统计
        mmFrameStats_Update(&stats);
    }

    mmFrameStats_Destroy(&stats);
}

2.前置数据结构组件

// 每秒的毫秒数
#define MM_USEC_PER_SEC 1000000

// 秒表,用来计时
struct mmClock;

3.主要数据结构

enum
{
    // [0x00, 0xFF] 0x40 = 64 . 
    // Very close to the commonly used 60 frame rate.
    mmFrameStatsCacheSize = 0x40,
    mmFrameStatsCacheMask = mmFrameStatsCacheSize - 1,
    mmFrameStatsCacheTime = mmFrameStatsCacheSize * MM_USEC_PER_SEC,
};

// Frame rate statistics based on circular queues
struct mmFrameStats
{
    // time clock.
    struct mmClock clock;

    // frame number, reset api can assign 0.
    mmUInt64_t number;

    // average fps.
    double average;

    // current frame interval.
    double interval;

    // frame interval total.
    double total;

    // frame interval cache.
    double cache[mmFrameStatsCacheSize];

    // cache index.
    mmUInt8_t index;
};

4.主要处理函数

MM_EXPORT_DLL void mmFrameStats_UpdateInterval(struct mmFrameStats* p, double interval)
{
    // cache the last frame interval.
    p->interval = interval;

    // accumulate the frame number.
    p->number++;

    // sub the index cache interval.
    p->total -= p->cache[p->index];
    // insert to back current interval.
    p->cache[p->index] = interval;
    // add the current interval.
    p->total += interval;

    // index++
    p->index++;
    // index %= CacheSize
    p->index &= mmFrameStatsCacheMask;

    // fps value update.
    // if total == 0.0 the fps_avge will be +inf, but it's correct.
    p->average = ((double)mmFrameStatsCacheTime) / p->total;
}

5.原理

更新时间时,我们仅减掉出队的间隔时间,加上进队的间隔时间,然后求平均,能避免遍历反复累加全体时间缓冲。利用2幂的特性,我们使用位操作可以快速回环索引,避免求余操作。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:31:56  更:2022-04-27 11:33:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:44:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码