1.1流畅度相关概念刷新率 vs 帧率刷新率:美妙屏幕刷新次数,手机品目的刷新率是60HZ帧率:GPU在一秒内绘制的帧率
撕裂 vs 掉帧撕裂:因为屏幕的刷新过程是自上而下、自左向右的,如果帧率>刷新率,当屏幕还没有刷新n-1帧的数据时,就开始生成第n帧的数据了,从上到下,覆盖第n-1帧。如果此时刷新屏幕,就会出现图像的上半部分是第n帧的,下半部分是第n帧的现象。CPU/GPU一直都在渲染。掉帧:Android系统每隔16ms发出VSYNC信号,触发GPU对UI进行渲染,如果你的某个操作花费时间是24ms,系统在得到VSYNC信号的时候由于还没有准备好,就无法进行更新任何内容,那么用户在32ms内看到的会是同一帧画面(卡顿现象),即丢帧现象。
单缓冲 vs VSYNC vs 双缓存 vs 三缓存单缓冲(没有引入CSync):GPU向缓存中写入数据,屏幕从缓冲中读取数据,刷新后显示。有余刷新率和帧率并不总是一致的,很可能导致撕裂现象。为了解决单缓冲的画面撕裂问题,出现了双缓存和VSYCNCVSYCNC和双缓存:双缓存是用来两个缓存去:Back Buffer、Frame Buffer 当写入下一帧是,GPU会先填充 Back Buffer中,当刷新屏幕时,屏幕从Frame Buffer 中读取数据,VSYNC主要是完成帧的复制,下一帧的渲染三重缓存:双重缓存的缺陷在于:当 CPU/GPU 绘制一帧的时间超过 16 ms 时,会产生 Jank。更要命的是,产生 Jank 的那一帧的显示期间,GPU/CPU 都是在闲置的。
(相关资料图)
FPS原理FPS是Frame per second的缩写,即每秒的帧数.这一术语广泛的应用于计算机图形学,视频采集,游戏等。
这里主要介绍一下视频游戏中的帧率,第一个First person shooter game的帧率只有大概6FPS,但是依然很成功。不过随着硬件设备,尤其是显卡性能的加强,现在游戏的帧率一般在30FPS~100FPS之间。由于每帧图像所消耗的时间不一样,造成帧率是在不断变化的,所以每个游戏都会设定一个最大的帧率,以保证平滑的切换。
// Timing... static QTime time; static int frames = 0; static bool started = false; if (!started || time.elapsed() > 1000) { qreal fps = frames * 1000. / time.elapsed(); if (fps == 0) m_current_fps = "counting fps..."; else m_current_fps = QString::fromLatin1("%3 FPS").arg((int) qRound(fps)); time.start(); started = true; frames = 0; } else { ++frames; p.setOpacity(1); p.setFont(QFont("times", 30)); p.fillRect(5, height() - 40, 250, 40, Qt::white); p.drawText(10, height() - 8, m_current_fps); } }
由于一般实时的游戏都已一个定时器不断地刷新画面,所以每一帧的输出都是通过paintEvent来完成的。将上面这段代码放入paintEvent就可以统计出每秒的帧率。
那么怎么控制最大的帧率呢?
其实也很简单,就是通过设置定时器的interval来完成的,考虑到现在显示器的显示频率一般在60HZ,所以interval一般设置为1000/60ms 比较好,即60FPS是一个理论上最大的帧率。
帧率(FPS)计算的六种方法总结:一、固定时间帧数法帧率计算的公式为:
fps = frameNum / elapsedTime;如果记录固定时间内的帧数,就可以计算出同步率。此种方法用得较多。
int fps(){ static int fps = 0; static int lastTime = getTime(); // ms static int frameCount = 0; ++frameCount; int curTime = getTime(); if (curTime - lastTime > 1000) // 取固定时间间隔为1秒 { fps = frameCount; frameCount = 0; lastTime = curTime; } return fps;}
还有另一种写法:int fps(int deltaTime){ static int fps = 0; static int timeLeft = 1000; // 取固定时间间隔为1秒 static int frameCount = 0; ++frameCount; timeLeft -= deltaTime; if (timeLeft < 0) { fps = frameCount; frameCount = 0; timeLeft = 1000; } return fps;}
二、固定帧数时间法帧率计算的公式为:fps = frameNum / elapsedTime;如果每隔固定的帧数,计算帧数使用的时间,也可求出帧率。此种方法使用得较少。
int fps(){ static int fps = 0; static int frameCount = 0; static int lastTime = getTime(); // ms ++frameCount; if (frameCount >= 100) // 取固定帧数为100帧 { int curTime = getTime(); fps = frameCount / (curTime - lastTime) * 1000; lastTime = curTime; frameCount = 0; } return fps;}
三、实时计算法实时计算法直接使用上一帧的时间间隔进行计算,结果具有实时性,但平滑性不好。
int fps(int deltaTime) // ms{ int fps = static_cast(1.f / deltaTime * 1000); // 别忘了先转换为浮点数,否则会有精度丢失 return fps;}
四、总平均法总平均法使用全局帧数除以全局时间,以求出帧率。
int beginTime = getTime();int fps(){ static int frameCount = 0; ++frameCount; int deltaTime = getTime() - beginTime(); return static_cast(frameCount * 1.f / deltaTime * 1000); // 别忘了先转换为浮点数,否则会有精度丢失}
五、精确采样法精确采样法采样前N个帧,然后计算平均值。此种方法需要额外的内存空间,所以不常用。
int fps(int deltaTime) // ms{ static std::queue q; static int sumDuration = 0; // ms int fps = 0; if (q.size() < 100) // 样本数设为100 { sumDuration += deltaTime; q.push(deltaTime); fps = static_cast(q.size() * 1.f / sumDuration * 1000.f); // 别忘了转换为浮点数,否则会有精度丢失 } else { sumDuration -= q.front(); sumDuration += deltaTime; sumDuration.pop(); sumDuration.push(deltaTime); fps = static_cast(100.f / sumDuration * 1000.f); // 别忘了转换为浮点数,否则会有精度丢失 } return fps;}
六、平均采样法平均采样法利用上次的统计结果,克服了精确采样法需要使用额外空间的缺点。此种方法较常用。
int fps(int deltaTime) // ms{ static float avgDuration = 0.f; static alpha = 1.f / 100.f; // 采样数设置为100 static int frameCount = 0; ++frameCount; int fps = 0; if (1 == frameCount) { avgDuration = static_cast(deltaTime); } else { avgDuration = avgDuration * (1 - alpha) + deltaTime * alpha; } fps = static_cast(1.f / avgDuration * 1000); return fps;}
关键词:
-
APP性能测评分析_资讯推荐
1 1流畅度相关概念 刷新率vs帧率 刷新率:美妙屏幕刷新次数,手机品目的刷新率是60HZ 帧率:GPU在一秒内绘制的帧率
-
win7激活错误代码0xc004f063如何解决_win7激活错误代码0xc004f063|天天速讯
1、windows7旗舰版激活的时候如果出现错误代码0xC004F063提示,就说明系统还没有激活,还需要继续执行激活操
-
【环球热闻】科德数控科创板再融资审核状态更新为“已受理”
机会报从上海证券交易所网站获悉,科德数控(688305)科创板再融资(-3,拟融资6 00亿元)审核状态更新为“已受理”,更新时间为2023年03月23日,受理
-
【世界报资讯】世外桃源的主人公是谁
世外桃源的主要人物是武陵人(其实就是陶渊明自己的化身)和桃源村民。具体内容《世外桃源》出自陶渊明的《桃花源记》,由于陶渊明生活的时代
-
ubitricity将利物浦现有的电动汽车充电网络增加三倍-环球即时看
利物浦市议会已任命壳牌全资子公司ubitricity安装由300个路边电动汽车(EV)充电点组成的网络,地点
-
四捆“大件”散落一地,急坏了驾驶员!执法人员:“我们把吊车叫来了” 每日视点
近日,杭州市交通运输行政执法队高速二大队执法人员在日常巡查时,发现径山服务区北区停车场内停着一辆红色大货车,车上装满了黑色的废棉,右
-
中手游2022年总营收27亿 净亏损2亿元同比转亏 研发投入同比增69.5% 全球视点
3月22日,香港主板上市公司中手游公布2022年业绩报告。报告显示,2022年中手游实现营业总收入27 14亿元,同比下降31 41%;净亏损2 169亿元,同
-
冠心病的症状表现在哪些方面早期50(冠心病的症状表现在哪些方面)-环球快播
1、冠心病的症状如下:(1)原发性心脏骤停:原发性心脏骤停是一突然事件,设想是由于心电不稳定所引起;没有可以作出其他诊断的依据。2、如果未
-
克钦能否独立_克钦独立军
1、克钦军总兵力不超过1 5万人,分为5个旅,加上各种政府工作人员也只有3 2万多人;也有说法称只有8000人。2、多
-
今日报丨邯郸学步的道理是什么
1、邯郸学步这个寓言故事告诉我们的道理是,做事不能生搬硬套,机械地模仿别人。这样不但学不到别人的长处,反而会把自己的优点和本领也丢掉。
-
环球快讯:广发期货:焦炭建议暂且观望
【利润】截至3月16日,钢联数据显示全国平均吨焦盈利27元 吨,利润周环比回升17元,山西准一级焦平均盈利70元 吨,山东准一级焦平均盈利27元
-
网红泰国报平安神情恍惚引质疑,是炒作还是真危险?
近日网红“美七”就因前往泰国后失联一周引发粉丝关注,而在她更新视频后,网友发现她疑似被控制,神志不清。首先,在“美七”向
-
热点在线丨据报道,美联储加息25个基点的决定可能有助于将美国抵押贷款利率维持在近期高点以下
据报道,美联储加息25个基点的决定可能有助于将美国抵押贷款利率维持在近期高点以下。抵押贷款银行家协会首席经济学家MikeFratantoni表示,此
-
天天微头条丨Java中restTemplate的使用
https: mp weixin qq com s mC0D1nuCqIori5bWtLorWQ
-
探访新工体:体验感大升级,这里不输世界杯球场!|今日热讯
时隔3年,记者再次走进崭新的工体。虽然这里已经“变身”为现代化的专业足球场,但还是会给人一种熟悉的味道,就像见到一位别来无恙的老朋友。
-
赞美抗击疫情的医护人员的句子
1、春节在岗,疫情坚守,最美的人!你和战斗在疫情一线的医护工作者及一切为抗击疫情默默工作的人员,都是这座城市最美的风景!值得我们为你们
-
上海石化:2022年度净亏损28.72亿元 同比转亏
上海石化(600688)公布年报,2022年实现营业收入825 18亿元,同比下降7 57%;归母净利润为亏损28 72
-
环球时讯:怀柔:全力做好空气重污染天气服务保障
受冷空气大风影响,今明两天我国北方大部地区将出现沙尘天气。怀柔区环卫公司严格落实道路清扫保洁作业规范,启动精细化管理作业模式,做好此
-
当年的美国梦一队有多无解,他们是否是美国队历史最强阵容?
如下解答:我的观点当然是。美国梦一队是美国的国家男篮名称,球队成名于1992年巴塞罗那奥运会。这支美国男篮首次囊括了当时NBA各位置上的顶尖
-
“三亚租车被坑”事件6人被刑拘 涉嫌敲诈勒索罪|天天热消息
3月22日,在三亚召开的旅游市场综合整治新闻发布会上,市公安局天涯分局副局长黄泽针对近期自媒体发布“三亚租车被坑”视频事