Libuv实现帧率控制

news2025/8/3 23:47:09

Libuv实现帧率控制

概念

  服务端帧率控制,保证在一段固定的时间内执行完所有事情(包括网络I/O等),如果有空余时间,那么我们Sleep等待一段时间。如果超时我们需要追帧

注意点

  1. 只要在程序中只有一个进程的情况下控制服务器的帧率,那么我们在Libuv中注册的定时器永远会存在一定的误差且误差时间无法确定。

  2. 在Libuv中的idle、prepare、check句柄队列中控制帧率,会无法有效的计算一次Loop循环所耗费的具体时间。因为我们只能依靠loop提供的时间,通过uv_now方法拿到本次循环(uv_run)即将执行的时间,但是由于loop提供的时间每次都未考虑定时器队列和pending队列的执行耗时,所以我们在idle、prepare、check句柄中计算每帧的耗时,是根本不精确的。

效果图
效果图

  1. 在定时器队列中控制帧率,首先不能保证Libuv每次循环都触发回调方法。其次该方式也无法有效的计算整个Libuv循环所耗费的具体时间。

解决方案:在Libuv主循环之外控制帧率,这样既可以有效计算整个Libuv循环循环一次所耗费的具体时间,也能保证Libuv每循环一次后都能进行帧率控制。

TIPS:关于UpdateFrame逻辑更新在哪里处理,不管是在idle、prepare、check句柄中处理,或者跟帧率控制一样在Libuv主循环之外处理,均可。

在博主的上篇介绍帧率控制的文件中,明显是有误区的,本篇文章进行纠正。

链接:https://ufgnix0802.blog.csdn.net/article/details/126754967

实现

TIPS:uv_hrtime是Libuv提供的获取时间API,内部实现比较简单。

	//数据结构
    uv_idle_t m_mainLoop;
    bool      m_quit;

    //帧率控制
    uint64_t  m_timerStart;
    uint64_t  m_timerEnd;
    int       m_frameRate;
    int       m_repeat;
    DWORD     m_durationFrameTime;
    DWORD     m_realTime;
	if (0 != uv_idle_start(&m_mainLoop, MainLoop)) {		//在Idle句柄中执行UpdateFrame
        LOG_ERROR << "uv_idle_start err";
        goto Exit;
    }
    m_mainLoop.data = &pFunc;

    m_timerStart = uv_hrtime() / 1000000;                   //纳秒转毫秒,即单位为毫秒。记录第一次逻辑帧循环时间
    m_timerEnd   = 0;
    m_repeat     = 1;

    while (true) {
        //Update
        uv_run(&m_loop, UV_RUN_ONCE);

        m_timerEnd          = uv_hrtime() / 1000000;        //纳秒转毫秒,即单位为毫秒,每次uv_run运行完获取一下截止时间
        m_durationFrameTime = (DWORD)(m_frameRate * m_repeat);//m_frameRate是我们自己设计的控制逻辑帧,比如1000,即1s。m_repeat会记录当前是第几次循环。那么控制逻辑帧 x 循环次数 = 累积循环帧时间
        m_repeat++;
        m_realTime = (DWORD)(m_timerEnd - m_timerStart);

        //规定的帧率内执行完所有事件,则Sleep;否则追帧。
        if (m_durationFrameTime < m_realTime) {
            LOG_INFO << "超出控制帧,追帧";
        }
        else {
            LOG_INFO << "m_durationFrameTime - m_realTime = sleep time:"
                << m_durationFrameTime << " - " << m_realTime << " = " <<
                m_durationFrameTime - m_realTime;
            Sleep(m_durationFrameTime - m_realTime);
        }

        if (m_quit) {		//退出标记位,bool类型
            LOG_INFO << "Service quiting...";
            break;
        }
    }

追帧算法

  当我们在规定的控制逻辑帧内处理完所有的事务,那么我们空余的时间应该让进程休息。那么关键来了,如果在规定的控制逻辑帧内没有执行完我们的事务,怎么办呢?那就是追帧,我们立刻执行下一帧,而下一帧的空余时间用来弥补当前帧规定逻辑时间内之外超出的时间。下面为上述追帧算法的图示;

效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch MNIST 手写数字识别 + 使用自己的测试集 + 数据增强后再训练

文章目录1. MNIST 手写数字识别2. 聚焦数据集扩充后的模型训练3. pytorch 手写数字识别基本实现3.1完整代码及 MNIST 测试集测试结果3.1.1代码3.1.2 MNIST 测试集测试结果3.2 使用自己的图片进行测试3.2.1 测试图片预处理代码3.2.2 测试图片结果4. 数据增强4.1 手动读取 MNIST …

11月更新!一口气上线20+新功能,3D架构拓扑图更具趣味性

优维EasyOps全平台又双叒叕上新功能了&#xff01; 不瞒各位小伙伴 写今天这篇文章时 我的手一直在抖 是激动的&#xff0c;这次要介绍的更新太牛了 尽管鹿小U已经 非常认真地研究过这20多个新功能 仍然无法用文字描述出 这次功能批量上新 「厉害程度」的十分之一 啥也…

【软件工程】实验1

文章目录实验一 软件需求分析实验目的实验内容「软件开发文档管理」软件开发过程涉及的文档软件开发阶段开发过程文档「软件开发文档管理」需求获取1. 功能需求2. 非功能需求「软件开发文档管理」需求分析、需求规格说明1. 需求概述1.1 功能需求1.2 非功能需求2. 用例模型2.1 用…

中证1000期指上市带来的交易机会

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

玩转UE4/UE5动画系统:UE5的运行时(动态)重定向治好了我的精神内耗

本文参考了油管UP主&#xff1a;AngelV的教程 前言 UE5中新的动画资源的&#xff08;静态&#xff09;重定向方法比UE4好用很多&#xff0c;但这种静态的重定向方式依然很让人头疼&#xff0c;因为我们需要对于每一个需要的动画资源为每一个目标骨架生成一套资源备份。尽管个过…

我参加NVIDIA Sky Hackathon 环境安装(编程环境)

强烈建议使用conda 第一个坑&#xff1a; 不使用 conda 进行 Python 环境管理直接使用本地的 Python 环境容易导致混乱 conda 安装 指定下载源 export DL_SITEhttps://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda 使用 wget 进行下载 wget -c $DL_SITE/Miniconda3-py…

德鲁克《卓有成效的管理者》学习笔记-掌握时间的学习和实践

针对德鲁克先生《卓有成效的管理者》书中提到了掌握时间部分学习的一些记录以及在日常工作中的实践。 1、为什么学习掌握时间 时间是最特殊的资源&#xff0c;为什么说它特殊呢&#xff1f;他租不到、顾不到、买不到&#xff0c;更不能以其他任何手段来获得。时间的供给丝毫没…

CC++指针实训(国防科大)

第1关&#xff1a;去掉字符串首尾空格 200 任务要求参考答案评论285 任务描述相关知识 定义指针变量指针的性质编程要求测试说明任务描述 本关任务&#xff1a;文本匹配的时候经常会因为空格个数的不同而匹配失败&#xff0c;现在要求你编写程序对输入的字符串进行处理&…

JUnit 5 单元测试教程

点赞再看&#xff0c;动力无限。 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录&#xff0c;有很多知识点和系列文章。 在软件开发过程中&#xff0c;我们通常都需要测试自己的代码运行是否正常&#xff0c;可能对一个函数进行简单测试…

传奇开服教程——legend/blue引擎替换和登陆器生成教程

1. 下载好legend/blue引擎的服务端解压到D盘 2. 下载legend/blue引擎和登陆器配置器 3. 解压legend/blue引擎和配置器到任意目录&#xff0c;运行对应引擎中的 开始更新程序.bat 就完成引擎替换&#xff0c;接着往下看 4. 打开登陆器配置器(Blue-LEG)中的 登陆器配置器-…

区块链软件开发中的虚拟机(virtual machine)

一、什么是虚拟机 虚拟机&#xff08;英语&#xff1a;virtual machine&#xff09;&#xff0c;在计算机科学中的体系结构里&#xff0c;是指一种特殊的软件&#xff0c;可以在计算机平台和终端用户之间创建一种环境&#xff0c;而终端用户则是基于虚拟机这个软件所创建的环境…

ORACLE 19C pdb修改的参数保存在哪个数据字典中?

PDB关闭后&#xff0c;保存在&#xff1a; pdb_spfile$中。 下面举例&#xff1a; 在PDB1中修改 ddl_lock_timeout10 SQL> alter session set containerpdb1; Session altered. SQL> show parameter ddl_ NAME TYPE VALUE ------------------------------------ --------…

路由进阶:双点双向路由重发布实验配置

实验拓扑 网络拓扑及IP编址如上图所示&#xff1b;设备的互联地址为192.168.xy.0/24。其中x、y为设备编号。例如R1-R3之间互联的链路网段为192.168.13.0/24&#xff0c;并且R1的接口地址为192.168.13.1&#xff0c;R3的接口地址为192.168.13.3&#xff0c;也就是说IP地址的最后…

Mac电脑升级13系统后,git clone 代码报错,mac升级后git ssh用不了

mac系统出了新版本 13.0.1 后&#xff0c;androidstudio push, pull 代码一直报错&#xff1a; 如下&#xff1a; Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the reposito…

基于PHP+MySQL的校园餐厅展示订餐系统

校园餐厅展示系统主要是实现用户在线订餐功能,由于校园餐厅每天的销售量大,而传统的订餐一直采用手工操作,尤其是在订餐管理部分存在工作量大效率低、日常订单数据经常出错、订单查询困难、用户需求信息不能及时掌握等一系列的问题。校园餐厅展示系统的开发应用,能够实现用户的…

《围城》笔记

《围城》&#xff0c;依稀记得初中时看到较高年级的学长手里攥着去上课&#xff0c;这位学长是个文科生&#xff0c;属于比较爱看小说的类型。前些天偶尔看到围城这个熟悉的名字&#xff0c;于是看了看。 杨绛女士在文章的最后面提到了钱钟书写《围城》的背景&#xff0c;她是陪…

A Philosophy of Software Design读书笔记——分or合

软件设计中有个很重要的问题&#xff1a;两个功能&#xff0c;是分成两部分实现&#xff0c;还是合在一部分实现呢 合or分的目的是减少系统复杂度&#xff0c;但是拆分有带来一些复杂度&#xff0c;比如&#xff1a; 1、组件个数增加复杂性&#xff0c;难以追踪每个组件&…

Foxit PDF SDK for Linux (C++ Library) 8.4.1 Crack

适用于Linux平台的行业优秀的PDF技术 Foxit PDF SDK Linux版本&#xff0c;一款提供给Linux平台开发人员的强大的PDF库。它提供了简单易用的C接口和Java接口&#xff0c;允许开发人员将PDF显示、导航、创建、搜索、注释、保护、PDF文本提取、图片转换、表单数据收集和编辑功能…

JavaScript代码是怎么在浏览器里面运行起来的?

JavaScript代码是怎么在浏览器里面运行的&#xff1f;下面简单探索一下 浏览器内核 浏览器内核&#xff08;Rendering Engine&#xff09;&#xff0c;常见的叫法如&#xff1a;排版引擎、解释引擎、渲染引擎&#xff0c;现在流行称为浏览器内核。 浏览器内核说明IETridentIE…

3415: 【提高】小 X 的佛光

3415: 【提高】小 X 的佛光 时间限制: 1.000 Sec 内存限制: 128 MB 提交: 14 解决: 7 [命题人:][下载数据: 110] 提交状态报告 题目描述 题目背景】 小 X 是远近闻名的学佛&#xff0c;平日里最喜欢做的事就是蒸发学水。 【题目描述】 小 X 所在的城市 X 城是一个含有 N…