ios查看帧率的软件_iOS实时流畅性监控
移动APP开发,性能一直是我们关心的重要话题,Xcode提供了一些方便的工具检测性能问题,但是这些工具使用并不方便,一般只有在发现性能问题的时候我们才会使用这些工具。快速的发现性能问题,有助于我们主动使用这些工具,提升APP的性能。本文主要介绍一种实时监测iOS APP帧率的实现方案。
画面展示过程
画面的生成到展示需要经过CPU处理和GPU处理两个过程,其中CPU主要负责软件层面的工作,GPU主要负责硬件层面的工作。这中间的过程大致可以分为六个步骤:
布局 - 准备视图/图层层级,设置图层属性。
显示 - 这是图层的寄宿图片被绘制的阶段。绘制有可能涉及你的-drawRect:和-drawLayer:inContext:方法的调用路径。
准备 - 这是Core Animation准备发送动画数据到渲染服务的阶段。这同时也是Core Animation将要执行一些别的事务例如解码动画过程中将要显示的图片的时间点。
提交 - 这是最后的阶段,Core Animation打包所有图层和动画属性,然后通过IPC(内部处理通信)发送到渲染服务进行显示。
对所有的图层属性计算中间值,设置OpenGL几何形状(纹理化的三角形)来执行渲染
在屏幕上渲染可见的三角形
前五个阶段都在软件层面处理(通过CPU),只有最后一个被GPU执行。我们真正只能控制前两个阶段:布局和显示。Core Animation框架在内部处理剩下的事务,你也控制不了它。但是在布局和显示阶段,你可以决定哪些由CPU执行,哪些交给GPU去做。
这方面的细节不再过多介绍,苹果的官方文档有详细的阐述,感兴趣的同学可以看这个。
为了做到动画的平滑,一般需要以60帧每秒的速度。所以每帧画面的处理过程只有16.6ms,如果某帧处理时间超出,则可能影响到后续帧的展示,造成丢帧,丢帧过多时会造成肉眼可见的卡顿。
主流监测方案
现在主流的卡顿监控方案主要有两种:
FPS监控:通过计算主线程一段时间内的RunLoop调用次数衡量当前页面绘制的质量
主线程卡顿监控: 通过开辟一个子线程监控主线程RunLoop状态区域的耗时,检测是否发生卡顿
用到了第一种实现方案,微信读书和美团结合使用了这两种方案。
这两种方案都集中于监控主线程runloop的状态,然而在实际的测试中,我发现有时候出现明显的卡顿时,主线程的指标反馈良好。
网上有人详细阐述了这个现象,详见。
正如我们在上一节所说,画面的展示不仅和CPU相关,还和GPU有很大的关系。所以,如果能对GPU的性能也做到监控,能更好的反映APP的当前性能。
实时帧率监控实现
对于CPU的监控,可以简单的创建一个CADisplayLink,计算一秒内的调用次数得到FPS数据,实现效果如下图:
PS: demo通过改造实现,测试设备为iPad4,系统iOS10.3.3,选用此设备的原因在于iPhone设备在本文后续一些测试中不会出现掉帧的现象,难以进行对比。在本次测试中,滑动有细微的卡顿,但是由于经过了录屏和转换gif两个过程,gif图已很难辨别出卡顿现象。
对于GPU的监控,提供了一种思路,引入SKView,并监控刷新频率来反馈GPU性能指标,然而实际测试效果并不理想。
受这种思路的启发,我尝试通过计算GLKView中draw call的调用次数,监测GPU的帧率,实现后测试效果如下:
很明显可以注意到GPU的帧率降低到了12帧左右,但是CPU的帧率同时也相应降低到了12帧!这种方案虽然能一定程度反映GPU性能指标,但是却无法将CPU的性能和GPU的性能指标分离。我推测造成这个问题的原因是GPU的draw call调用阻塞了当前runloop。普通的OpenGL调用不应该造成CPU和GPU之间的同步,但是一些OpenGL的操作会造成CPU和GPU之间同步现象的出现,stackOverflow上有人讨论过这个问题。
分离CPU和GPU的性能指标有两种思路:
可以通过开关关闭对GPU的监控,然而这样操作相对较麻烦
尝试将GPU的draw call放在背景线程的runloop中调用
由于GLKView是UIView的子类,在背景线程调用GLKView的方法,可能会造成不可预期的影响。或许可以考虑使用图层的方式渲染OpenGL,来规避这个问题。CAEAGLLayer看起来是一个好的解决方案。
实现后效果如下:
可以看到CPU和GPU的性能指标如预期一般成功分离了。
参考链接
本文来自网易实践者社区,经作者彭衍授权发布。
ios查看帧率的软件_iOS实时流畅性监控相关推荐
- ios查看帧率的软件_程序员必看!直播软件开发弱网下保障高清流畅推流的方法...
通常情况下程序员在开发直播软件时,优化卡顿和延迟是比较多的,只要是优化欠佳,就会导致前端APP运行出问题,为了帮助程序员在开发过程中能更加合理有效的优化,小编在这里从开发的层面简要介绍一下影响直播体验 ...
- 刺激战场测试fps软件,绝地求生刺激战场怎么查看帧率?查看帧率方法一览
绝地求生刺激战场是最近很火的一个吃鸡手游,这个游戏中帧率越高玩起来越顺,很多小伙伴都想看看自己的帧率,大家都在问这个游戏是怎么查看帧率的?小编就为大家带来了查看帧率方法一览! 刺激战场查看FPS方法分 ...
- 通过Android软件ZAX实时查看Zabbix监控
通过Android软件ZAX实时查看Zabbix监控 前言: 本文转自我的个人博客http://anyisalin.com 这几天在学习Zabbix, 昨天在Google Play上无意间看到一个软 ...
- 小兴看看Q强势发布,真正的全实时流畅体验
6月1日,在这个特殊的日子,中兴通讯重磅推出了一款智能摄像头新品--小兴看看Q.这款新品有着呆萌的可爱造型,主打1080P全实时流畅体验,依托多年技术积累,领先行业做到了真正的25帧/秒全高清实时在线 ...
- 有什么测试游戏帧率的软件,两款游戏帧率测试谁能生出_一加 6T(8GB RAM/全网通)_手机评测-中关村在线...
游戏测试环节: 帧率 为了控制不同机型以及处理器之外的硬件差异造成的影响,准确还原vivo NEX 旗舰版.iPhone X.黑鲨游戏手机三款手机的处理器在运行游戏的性能表现,三款机型的游戏模式(均开 ...
- 【转】iOS实时卡顿监控
转自http://www.tanhao.me/code/151113.html/ 在移动设备上开发软件,性能一直是我们最为关心的话题之一,我们作为程序员除了需要努力提高代码质量之外,及时发现和监控软件 ...
- 删除苹果自带软件后果_苹果IOS备忘录便签软件敬业签恢复删除内容应该怎么操作?...
敬业签是一款功能比较全面的苹果手机桌面备忘录便签软件,主要功能包括:云储存.多端云同步.提醒待办事项.时间管理.标记已完成.月视图和时间轴等.在使用苹果IOS备忘录便签软件敬业签的时候,如果不小心误删 ...
- ios 监测网页按钮_苹果IOS备忘录便签软件敬业签恢复删除内容应该怎么操作?...
敬业签是一款功能比较全面的苹果手机桌面备忘录便签软件,主要功能包括:云储存.多端云同步.提醒待办事项.时间管理.标记已完成.月视图和时间轴等.在使用苹果IOS备忘录便签软件敬业签的时候,如果不小心误删 ...
- win系统流畅度测试软件,视频对比:老电脑装Win7、Win10流畅性测试
原标题:视频对比:老电脑装Win7.Win10流畅性测试 Windows 10号称比Win7快30%,那么对于旧电脑来说,这一说法还成立吗? 下面网易找来了两台完全相同的三年前售价四千左右的主流电脑, ...
最新文章
- 2020-11-30 离散系统自适应控制中的一个关键性引理及证明
- mysql-workbench连接数据库
- Express实现路由分发控制、RESTful API
- Android手机用wifi连接adb调试的方法
- SQLServer报表服务研究文档
- 原型模式(Prototype)C++实现
- python算法练习——解空间的穷举搜索与Google方程式
- q87芯片组服务器主板,Intel 100系列芯片组详解:史上最良心!
- 有哪些建议给应届毕业生(转载知乎某大佬)
- C#打包文件夹成zip格式(包括文件夹和子文件夹下的所有文件)
- Shopee申请开店需要审核吗?
- 比较工具导出html比较结果,使用Beyond Compare如何生成文件比较报告
- SAP 特别总账标识和备选统驭科目
- open failed: EACCES (Permission denied)权限已加,写入sd卡仍报错的解决办法
- 数独 ( 三 ) ——解数独
- 灰度共生矩阵(GLCM)理解
- 图解研发团队架构、流程和绩效管理
- 逆波兰表达式-----------红黑树--------mysql(DDL)----生产者消费者模式
- java实现fcfs_JAVA从入门到精通之实现进程调度算法 FCFS
- php 修改session 目录,php自定义session保存目录
热门文章
- 基于Python3+Flask+SQLite的大学实验室设备管理系统
- osg20讲(读文件)
- lsf_10.1 安装教程
- T-linkage和J-linkage
- 如何访问海康威视摄像机的后台
- 应用计算机软件指南,2017计算机二级Access软件应用指南
- 极大似然估计用计算机求解,极值分布的极大似然估计及计算机实现 - read.pdf
- Java:阶乘0! = 1 1! = 1 2! = 2.....
- C语言刷题(6)(猜名次)——“C”
- 《漫画中国式项目管理》总结