原标题:一行代码监测FPS/内存/CPU

“没错,就是他。”

项目开发都会做一些调试,比如看看FPS的情况。

网上有不少工具,自己就参考做了一个比较简单的工具WHDebugTool,可以监测内存,CPU和FPS。

GitHub地址:https://github.com/remember17/WHDebugTool

WHDebugTool

1、快速使用

1.1 pod或直接把文件拖入项目

如果pod找不到WHDebugTool,就先pod setup

pod'WHDebugTool', '~> 1.1'

1.2 导入头文件

如果是pod进项目:

#import

如果是直接把文件拖入项目:

#import "WHDebugToolManager.h"

1.3 调用开关方法

一行代码开启或关闭监测。

// 这个方法调用的时候会判断监测是不是处于打开的状态,如果打开了则关闭,如果没有打开就开启。

[ [WHDebugToolManager sharedInstance] toggleWith:DebugToolTypeAll];

1.4 可选:也可以通过如下方式初始化和关闭

// 打开

- ( void)showWith:(DebugToolType)type;

// 关闭

- ( void)hideWith:(DebugToolType)type;

2. 参数说明

初始化方法中带有一个枚举参数

这个参数可以让三种监测随意组合。例如只想要监测FPS,就传入DebugToolTypeFPS

DebugToolTypeAll = 0, // FPS & Memory & CPU

DebugToolTypeFPS, // FPS

DebugToolTypeMemory, // Memory

DebugToolTypeCPU, // CPU

DebugToolTypeFPSMemory, // FPS & Memory

DebugToolTypeFPSCPU, // FPS & CPU

DebugToolTypeCPUMemory, // Memory & CPU

3. 实现方法

3.1 FPS实现方法(参考了YYKit中的检测工具)

首先简单介绍一下FPS:

FPS的意思是:每秒传输帧数(刷新率)。

值越高,画面越流畅,值越低越卡顿。

下面来看一下iOS实现检测FPS的原理:

主要用的是CADisplayLink:一个和屏幕刷新率相同定时器。

创建CADisplayLink对象的时候会指定一个selector,把创建的CADisplayLink对象加入runloop,所以就实现了以屏幕刷新的频率调用某个方法。

在调用的方法中计算执行的次数,用次数除以时间,就算出了FPS。

注:iOS正常刷新率为每秒60次。

- ( void)setDisplayLink {

// 初始化CADisplayLink

_displayLink = [ CADisplayLinkdisplayLinkWithTarget: selfselector: @selector(displayLinkTicks:)];

// 把CADisplayLink对象加入runloop

[_displayLink addToRunLoop:[ NSRunLoopcurrentRunLoop] forMode: NSRunLoopCommonModes];

}

- ( void)displayLinkTicks:( CADisplayLink*)link {

// 累加方法执行的次数

_performTimes ++;

if(_lastTimestamp == 0) {

_lastTimestamp = link.timestamp;

return;

}

// 记录执行的时间

NSTimeIntervalinterval = link.timestamp - _lastTimestamp;

// 当时间经过一秒的时候再计算FPS,否则计算的太过频繁

if(interval >= 1) {

// iOS正常刷新率为每秒60次,执行次数/时间

floatfps = _performTimes / interval;

// 重新初始化记录值

_performTimes = 0;

_lastTimestamp = link.timestamp;

// 把计算的值传出去

if( self.fpsBlock) {

self.fpsBlock(fps);

}

}

}

3.2 内存监测实现方法

- ( float)getUsedMemory {

task_basic_info_data_ttaskInfo;

mach_msg_type_number_tinfoCount = TASK_BASIC_INFO_COUNT;

kern_return_tkernReturn = task_info(mach_task_self(),

TASK_BASIC_INFO,

( task_info_t)&taskInfo,

&infoCount);

if(kernReturn != KERN_SUCCESS) { returnNSNotFound; }

returntaskInfo.resident_size/ 1024.0/ 1024.0;

}

3.3 CUP检测实现方法

floatcpu_usage(){

kern_return_tkr;

task_info_data_ttinfo;

mach_msg_type_number_ttask_info_count;

task_info_count = TASK_INFO_MAX;

kr = task_info(mach_task_self(), TASK_BASIC_INFO, ( task_info_t)tinfo, &task_info_count);

if(kr != KERN_SUCCESS) {

return-1;

}

task_basic_info_tbasic_info;

thread_array_tthread_list;

mach_msg_type_number_tthread_count;

thread_info_data_tthinfo;

mach_msg_type_number_tthread_info_count;

thread_basic_info_tbasic_info_th;

uint32_tstat_thread = 0;

basic_info = ( task_basic_info_t)tinfo;

kr = task_threads(mach_task_self(), &thread_list, &thread_count);

if(kr != KERN_SUCCESS) {

return-1;

}

if(thread_count > 0)

stat_thread += thread_count;

longtot_sec = 0;

longtot_usec = 0;

floattot_cpu = 0;

intj;

for(j = 0; j < thread_count; j++)

{

thread_info_count = THREAD_INFO_MAX;

kr = thread_info(thread_list[j], THREAD_BASIC_INFO,

( thread_info_t)thinfo, &thread_info_count);

if(kr != KERN_SUCCESS) {

return-1;

}

basic_info_th = ( thread_basic_info_t)thinfo;

if(!(basic_info_th->flags & TH_FLAGS_IDLE)) {

tot_sec = tot_sec + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds;

tot_usec = tot_usec + basic_info_th->user_time.microseconds + basic_info_th->system_time.microseconds;

tot_cpu = tot_cpu + basic_info_th->cpu_usage / ( float)TH_USAGE_SCALE * 100.0;

}

}

kr = vm_deallocate(mach_task_self(), ( vm_offset_t)thread_list, thread_count * sizeof( thread_t));

assert(kr == KERN_SUCCESS);

returntot_cpu;

}

后记

WHDebugTool

内存监测的值与Xcode给的有出入,所以这些工具给出的值仅供参考。

CUP和FPS的检测结果相对来说比较接近。

我的GitHub:https://github.com/remember17返回搜狐,查看更多

作者:remember17

https://www.jianshu.com/p/0d94a81a31db

iOS开发整理发布,转载请联系作者获得授权

责任编辑:

cpu帧数测试软件,一行代码监测FPS/内存/CPU相关推荐

  1. 小米11帧数测试软件,小米11Ultra外观、跑分、配置性能及拍照效果全面测评

    小米11Ultra这款手机时昨天刚推出的手机,那么这款手机到底怎么样呢,今天小编对这款手机的外观.跑分.配置性能及拍照效果做了全面的测评,感兴趣的用户一起看看吧. 小米11Ultra全面测评详情 外观 ...

  2. 华为nova3游戏帧数测试软件,中端机游戏体验测试,OPPO K1与华为nova 3谁更胜一筹?...

    原标题:中端机游戏体验测试,OPPO K1与华为nova 3谁更胜一筹? 元旦将至,新的一年即将到来,回顾2018,今年的各大手机品牌纷纷推出了令人耳目一新的旗舰机型.相比之下,中端机的市场也是出奇的 ...

  3. ps4帧数测试软件,《地平线:零之黎明》PS4/Pro帧数测试 优化极佳

    索尼发行的 PS4 第一方大作<地平线:零之黎明>(Horizon Zero Dawn)即将于 2 月 28 日正式上市,近日热衷于画面测试的外媒 DigitalFoundry 放出了本作 ...

  4. 华为nova3游戏帧数测试软件,华为nova3最全游戏体验报告:手游玩家一定不能错过...

    华为nova3搭载麒麟970人工智能芯片,并支持GPU Turbo.4D智能震撼.游戏免打扰等专为提升游戏体验的技术,那Nova3的实际游戏体验到底如何呢? 楼主选择了三款游戏进行测试,分别为王者荣耀 ...

  5. 断点帧数测试软件,《幽灵行动:断点》PC版性能表现分析

    <幽灵行动:断点>是系列最新作品,本作采用AnvilNext 2.0引擎,外媒DSOGaming今天评测了它在PC上的性能表现. 以下是文章全文: 本次PC性能测试分析我们使用的是Inte ...

  6. 塔科夫帧数测试软件,2070S帧数实测-2060S帧数实测-2060帧数实测-测试显卡、平台及游戏设置-索泰图灵架构显卡《逃离塔科夫》帧数对比实测_游戏硬件_游侠网...

    相对更为进阶的索泰RTX 2070 Super X-Gaming OC可以说是稳妥站在显卡发烧级这一阶层的产品了,就连笔者本人的电脑也装备着这款显卡.然而不吹不黑,这款显卡由于与2060S有着同样大小 ...

  7. 渡神纪帧数测试软件,渡神纪芬尼斯崛起配置要求高吗 渡神纪配置要求详细介绍_游侠网...

    渡神纪芬尼斯崛起配置要求高吗?本作将在12月3日登陆主机和PC,很多玩家比较关心游戏的配置,这里给大家带来了渡神纪配置要求详细介绍,快来了解下吧. 渡神纪配置要求详细介绍 最低要求(720p/30 f ...

  8. 渡神纪帧数测试软件,育碧《渡神纪》PC配置要求公布 最低只要i5+GTX 660

    育碧全新原创IP<渡神纪:芬尼斯崛起>PC配置要求现在已经公布,这款开放世界游戏只要i5-2400.GTX 660就能以低画质游玩,官方分4个等级介绍了配置需求.游戏支持超宽屏.多屏显示. ...

  9. 渡神纪帧数测试软件,渡神纪芬尼斯崛起配置 渡神纪配置要求

    育碧今日公布了旗下神话动作游戏<渡神纪 芬尼斯崛起>的具体配置需求信息以及 PC 版本特性的介绍视频.视频中说明到,游戏采用了经过调整的 Anvil 引擎来适配各种不同的平台,使用 DX1 ...

最新文章

  1. 三层架构的原理及实现
  2. module 'schedule' has no attribute 'every
  3. 【深度学习】449页pdf,FaceBook称其迈出“重塑AI科学的第一步”
  4. 【若依(ruoyi)】验证码
  5. 滑动窗口在重构数据集的作用
  6. mongodb数据库的备份与恢复
  7. Forrester云原生开发者洞察白皮书,低代码概念缔造者又提出新的开发范式
  8. Xcode5 使用gitHub上库的SSH地址建立Repository,以及如何通过Xcode把代码传到GitHub
  9. java调用机器上的shell脚本
  10. C/C++头文件全解析
  11. 激活策略 查询_苹果手机未激活也可能不是原装货,激活过的手机到底能不能买?...
  12. matlab二元一次方程求解_方程的计算机处理913_Matlab
  13. lintcode-76-最长上升子序列
  14. python接口自动化代码_python接口自动化(十六)--参数关联接口后传(详解)
  15. java get 和post_[Java教程]get和post方法的区别
  16. 监狱干警定位管理系统
  17. 每日新知——MySQL索引类型及创建
  18. html图片点击加边框颜色代码,用HTML代码给图片添加边框方法
  19. 所有学java的女生都进来看看
  20. 屏幕录制软件camtasia studio 8序列号激活

热门文章

  1. 仿牛客社区——开发社区搜索功能
  2. unifiedremote 手机遥控器
  3. Android多进程(一)—— 开启多进程
  4. 冲突管理的6种方法归纳
  5. 程序员最浪漫的表白方式,将情书写在她的照片里,Python简直太厉害啦~
  6. 最新目的地扩增使AVOXI成为全球最大的虚拟电话号码覆盖区域
  7. Android 29: remount failed
  8. order_by_、group_by_、having的用法区别
  9. mysql宿舍水电管理系统_宿舍水电管理系统
  10. 必须用计算机吗,路由器可以不用电脑吗_路由器一定要连接电脑吗-系统城