克魔助手 - iOS性能检测平台

这篇具有很好参考价值的文章主要介绍了克魔助手 - iOS性能检测平台。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

众所周知,如今的用户变得越来越关心app的体验,开发者必须关注应用性能所带来的用户流失问题。目前危害较大的性能问题主要有:闪退、卡顿、发热、耗电快、网络劫持等,但是做过iOS开发的人都知道,在开发过程中我们没有一个很直观的工具可以实时的知道开发者写出来的代码会不会造成性能问题,虽然Xcode里提供了耗电量检测、内存泄漏检测等工具,但是这些工具使用效果并不理想(如Leak无法发现循环引用造成的内存泄漏)。所以这篇文章主要是介绍一款实时监控app各项性能指标的工具,包括CPU占用率、内存使用量、内存泄漏、FPS、卡顿检测,并且会分析造成这些性能问题的原因。

CPU

CPU 是移动设备最重要的组成部分,如果开发者写的代码有问题导致CPU负载过高,会导致app使用过程中发生卡顿,同时也可能导致手机发热发烫,耗电过快,严重影响用户体验。 如果想避免CPU负载过高可以通过检测app的CPU使用率,然后可以发现导致CPU过高的代码,并根据具体情况优化。那该如何检测CPU使用率呢?大学期间学过计算机的应该都上过操作系统这门课,学过的都知道线程CPU是调度和分配的基本单位,而应用作为进程运行时,包含了多个不同的线程,这样如果我们能知道app里所有线程占用 CPU 的情况,也就能知道整个app的 CPU 占用率。幸运的是我们在Mach 层中 thread_basic_info 结构体发现了我们想要的东西,thread_basic_info 结构体定义如下:

CPU内存监控

克魔助手提供了分析内存占用、查看 CPU 实时活动数据以及追踪特定应用程序的功能,让开发者可以更好地了解应用程序的运行情况。 以下是一些示例截图:

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c





 

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c





 

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c





同样,克魔助手还提供了内存、GPU 性能监控、网络监控等功能,开发者可以查看实时数据活动和追踪应用程序的特定功能。 如下:

内存监控

以下是内存监控的示例截图:

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c

Memory

物理内存(RAM)与 CPU 一样都是系统中最稀少的资源,也是最有可能产生竞争的资源,应用内存与性能直接相关 - 通常是以牺牲别的应用为代价。 不像 PC 端,iOS 没有交换空间作为备选资源,这就使得内存资源尤为重要。

App占用的内存

获取app内存的API同样可以在Mach层找到,mach_task_basic_info 结构体存储了 Mach task 的内存使用信息,其中 resident_size 就是应用使用的物理内存大小,virtual_size 是虚拟内存大小。

#define MACH_TASK_BASIC_INFO     20         /* always 64-bit basic info */
struct mach_task_basic_info {
        mach_vm_size_t  virtual_size;       /* virtual memory size (bytes) */
        mach_vm_size_t  resident_size;      /* resident memory size (bytes) */
        mach_vm_size_t  resident_size_max;  /* maximum resident memory size (bytes) */
        time_value_t    user_time;          /* total user run time for
                                               terminated threads */
        time_value_t    system_time;        /* total system run time for
                                               terminated threads */
        policy_t        policy;             /* default policy for new threads */
        integer_t       suspend_count;      /* suspend count for task */
};

最后得到获取当前 App Memory 的使用情况:

- (CGFloat)usedMemory {
    task_basic_info_data_t taskInfo;
    mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;
    kern_return_t kernReturn = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&taskInfo, &infoCount);
    
    if (kernReturn != KERN_SUCCESS) {
        return NSNotFound;
    }
    
    CGFloat value = (CGFloat)(taskInfo.resident_size / 1024.0 / 1024.0);
    
    return value;
}

设备已使用的内存

+ (CGFloat)deviceUsedMemory {
    size_t length = 0;
    int mib[6] = {0};
    
    int pagesize = 0;
    mib[0] = CTL_HW;
    mib[1] = HW_PAGESIZE;
    length = sizeof(pagesize);
    if (sysctl(mib, 2, &pagesize, &length, NULL, 0) < 0) {
        return 0;
    }
    
    mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
    
    vm_statistics_data_t vmstat;
    
    if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count) != KERN_SUCCESS) {
        return 0;
    }
    
    int wireMem = vmstat.wire_count * pagesize;
    int activeMem = vmstat.active_count * pagesize;
    
    return (CGFloat)(wireMem + activeMem) / 1024.0 / 1024.0;
}

##设备可用的内存

+ (CGFloat)deviceAvailableMemory {
    vm_statistics64_data_t vmStats;
    mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
    kern_return_t kernReturn = host_statistics(mach_host_self(),
                                               HOST_VM_INFO,
                                               (host_info_t)&vmStats,
                                               &infoCount);
    
    if (kernReturn != KERN_SUCCESS) {
        return NSNotFound;
    }
    
    return (CGFloat)(vm_page_size * (vmStats.free_count + vmStats.inactive_count)  / 1024.0 / 1024.0);
}

FPS

FPS即屏幕每秒的刷新率,范围在0-60之间,60最佳。FPS是测量用于保存、显示动态视频的信息数量,每秒钟帧数愈多,所显示的动作就会愈流畅,优秀的app都要保证FPS 在 55-60 之间,这样才会给用户流畅的感觉,反之,用户则会感觉到卡顿。 对于FPS的计算网上争议颇多,这边使用的和 YYKit 中的 YYFPSLabel 原理一样,系统提供了 CADisplayLink 这个 API,该API在屏幕每次绘制的时候都会回调,通过接收 CADisplayLink 的回调,计算每秒钟收到的回调次数得到屏幕每秒的刷新次数,从而得到 FPS,具体代码如下:

首先,为了使用克魔助手检查iOS游戏的帧率,需要在电脑上安装爱思助手或者iTunes驱动。随后,通过USB连接苹果手机到电脑,并启动克魔助手。

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c




 

设备选择

第二步,在工具左侧菜单栏中,打开“设备”窗口。窗口中会显示你连接的所有苹果设备,选择要查询的设备,然后选中设备。

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c




 

查看FPS和fps监测

第三步,点击“开始监听”,在右侧的“FPS曲线”查看当前应用程序的帧率。另外,在克魔助手中可以看到每秒图像

更新多少次,以及总图像更新次数,从而了解游戏性能如何。

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c





 

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c




 

CPU占比和应用追踪及特定APP数据

第四步,查看帧率是保证游戏顺畅性的重要因素,所以应用程序开发人员将会经常使用克魔助手检查苹果手机玩游戏的帧率。当然,游戏还有很多需要优化的地方,可以提高游戏整体性能,所以克魔助手不仅提供了监控帧率,还提供了可以分析内存占用,查看CPU实时活动数据,以及追踪特定app时等功能,让开发者可以更好地了解游戏运行情况。

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c




 

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c




 

克魔助手 - iOS性能检测平台,移动端产品,iOS上架,apple证书,cocoa,macos,objective-c




 

通过克魔助手的帮助,开发者可以方便快捷地检查苹果手机玩游戏的帧率。了解帧率和游戏性能对增加游戏用户量,增强用户体验和游戏的质量都非常重要,所以在开发过程中不要忘记检查苹果手机的帧率。

值得注意的是基于 CADisplayLink 实现的 FPS 在生产场景中只有指导意义,不能代表真实的 FPS,因为基于 CADisplayLink 实现的 FPS 无法完全检测出当前 Core Animation 的性能情况,它只能检测出当前 RunLoop 的帧率。

Freezing

为什么会出现卡顿

从一个像素到最后真正显示在屏幕上,iPhone 究竟在这个过程中做了些什么?想要了解背后的运作流程,首先需要了解屏幕显示的原理。iOS 上完成图形的显示实际上是 CPU、GPU 和显示器协同工作的结果,具体来说,CPU 负责计算显示内容,包括视图的创建、布局计算、图片解码、文本绘制等,CPU 完成计算后会将计算内容提交给 GPU,GPU 进行变换、合成、渲染后将渲染结果提交到帧缓冲区,当下一次垂直同步信号(简称 V-Sync)到来时,最后显示到屏幕上

上文中提到 V-Sync 是什么,以及为什么要在 iPhone 的显示流程引入它呢?在 iPhone 中使用的是双缓冲机制,即上图中的 FrameBuffer 有两个缓冲区,双缓冲区的引入是为了提升显示效率,但是与此同时,他引入了一个新的问题,当视频控制器还未读取完成时,比如屏幕内容刚显示一半时,GPU 将新的一帧内容提交到帧缓冲区并把两个缓冲区进行交换后,视频控制器就会把新的一帧数据的下半段显示到屏幕上,造成画面撕裂现象,V-Sync 就是为了解决画面撕裂问题,开启 V-Sync 后,GPU 会在显示器发出 V-Sync 信号后,去进行新帧的渲染和缓冲区的更新。

搞清楚了 iPhone 的屏幕显示原理后,下面来看看在 iPhone 上为什么会出现卡顿现象,上文已经提及在图像真正在屏幕显示之前,CPU 和 GPU 需要完成自身的任务,而如果他们完成的时间错过了下一次 V-Sync 的到来(通常是1000/60=16.67ms),这样就会出现显示屏还是之前帧的内容,这就是界面卡顿的原因(离屏渲染就是典型的卡顿问题)。不难发现,无论是 CPU 还是 GPU 引起错过 V-Sync 信号,都会造成界面卡顿。

那如何检测卡顿呢?比较常见的思路是:开辟一条单独的子线程,让这条子线程去实时检测主线程的 RunLoop 情况,实时计算 kCFRunLoopBeforeSources 和 kCFRunLoopAfterWaiting 两个状态之间的耗时是否超过某个阀值,如果超过阈值即认定主线程发生了卡顿。下面是代码实现:

static void runLoopObserverCallBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info)
{
    MyClass *object = (__bridge MyClass*)info;
    
    // 记录状态值
    object->activity = activity;
    
    // 发送信号
    dispatch_semaphore_t semaphore = moniotr->semaphore;
    dispatch_semaphore_signal(semaphore);
}

- (void)registerObserver
{
    CFRunLoopObserverContext context = {0,(__bridge void*)self,NULL,NULL};
    CFRunLoopObserverRef observer = CFRunLoopObserverCreate(kCFAllocatorDefault,
                                                            kCFRunLoopAllActivities,
                                                            YES,
                                                            0,
                                                            &runLoopObserverCallBack,
                                                            &context);
    CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
    
    // 创建信号
    semaphore = dispatch_semaphore_create(0);
    
    // 在子线程监控时长
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        while (YES)
        {
            // 假定连续5次超时50ms认为卡顿(当然也包含了单次超时250ms)
            long st = dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 50*NSEC_PER_MSEC));
            if (st != 0)
            {
                if (activity==kCFRunLoopBeforeSources || activity==kCFRunLoopAfterWaiting)
                {
                    if (++timeoutCount < 5)
                        continue;
                    // 检测到卡顿,进行卡顿上报
                }
            }
            timeoutCount = 0;
        }
    });
}              

当检测到卡顿后可以进一步收集卡顿现场,如堆栈信息等,关于收集堆栈信息这里就不细说,很多第三方库都有实现,我之前是使用了项目中已经集成的收集崩溃信息的三方库,通过这个库在收集堆栈信息。

MemoryLeak

内存泄漏也是造成app内存过高的主要原因,如果iPhone手机的性能都很强,如果一个app会因为内存过高被系统强制杀掉,大部分都是存在内存泄漏。内存泄漏对于开发和测试而言表现得并不明显,如果它不泄漏到一定程度是用户是无法察觉的,但是这也是开发者必须杜绝的一大问题。

查找内存泄漏

对于内存泄漏Xcode提供了Leak工具,但是使用过的人都知道Leak无法查出很多泄漏(如循环引用),在这里检测内存泄漏使用的是微信读书团队 Mr.佘 提供的工具 MLeakFinder。 这里大致讲一下实现原理,当一个VC(或者View)被pop或者被dismiss 2 秒后还没有被销毁则认定该VC(或View)发生了泄漏。那如何知道 2 秒后该对象有没有被释放呢,

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [self swizzleSEL:@selector(popViewControllerAnimated:) withSEL:@selector(swizzled_popViewControllerAnimated:)];
    });
}

通过方法交换将系统的pop方法换掉,然后注入自己的代码实现,当调用pop时会调用 willDealloc 方法,该方法实现如下:

- (BOOL)willDealloc {
    __weak id weakSelf = self;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        __strong id strongSelf = weakSelf;
        [strongSelf assertNotDealloc];
    });
    
    return YES;
}

通过弱引用持有自身,并在 2 秒后调用 assertNotDealloc, 如果 2 秒内该对象已释放这里的 weakSelf 为nil,也就什么都不会发生,反之则认为发生了内存泄漏,进行下一步操作,如弹出警告等。 这里只是大致讲一下 MLeakFinder 的原理,详细介绍可以去 他的博客 详细了解。

查找循环引用

查找循环引用使用的是 Facebook 开源库 FBRetainCycleDetector ,具体也可以去网上查找相关资料,这里就不详细说。文章来源地址https://www.toymoban.com/news/detail-826346.html

到了这里,关于克魔助手 - iOS性能检测平台的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter iOS上架指南

    本文探讨了使用Flutter开发的iOS应用能否上架,以及上架的具体流程。苹果提供了App Store作为正式上架渠道,同时也有TestFlight供开发者进行内测。合规并通过审核后,Flutter应用可以顺利上架。但上架过程可能存在一些挑战,因此可能需要专业技术人员或上架服务商的协助。

    2024年04月10日
    浏览(49)
  • iOS App 上架流程图文教学

    在上架App 之前必须先准备好开发者帐号,但申请开发者帐号因法兰克早在之前已经申请好了,故就跳过此步骤,直接从产生凭证到上传 App 开始讲起。 首先,要将自己辛苦写好的App 送审的话,则要依序做完下列几件事情即可。 在开发者后台产生 .cer(凭证档) 在开发者后台产

    2024年02月09日
    浏览(50)
  • iOS 应用上架的步骤和工具简介

    APP开发助手是一款能够辅助iOS APP上架到App Store的工具,它解决了iOS APP上架流程繁琐且耗时的问题,帮助跨平台APP开发者顺利将应用上架到苹果应用商店。最重要的是,即使没有配置Mac苹果机,也可以使用该工具完成一系列操作,包括iOS证书申请、创建iOS开发者证书和 iOS发布

    2024年02月15日
    浏览(38)
  • iOS App的打包和上架流程

    个人开发者账号 费用:99 美元/年(688.00元) 协作人数:仅限开发者自己 不需要填写公司的邓百氏编码( D-U-N-S Number) 支持账号下的 app 上线 App Store 需要创建 Apple ID 公司开发者账号: 费用:99 美元/年(688.00元) 允许多个开发者协作开发 需要填写公司的邓百氏编码( D-U

    2024年02月08日
    浏览(48)
  • windows下上架iOS应用到appstore

    现在由于跨平台技术的兴起,不使用原生技术就能开发出Android和iOS应用。Android应用上架较为简单不在本文讨论范围,而iOS应用上架appstore标准教程一般都是在mac下面操作,但现实中绝大部分跨平台开发者可能使用的是windows,所以本文介绍下在windows平台下上架iOS应用(.ipa文件

    2024年02月08日
    浏览(45)
  • iOS App的上架和版本更新流程

    作为一名iOSDeveloper,把开发出来的App上传到App Store是必要的。下面就来详细讲解一下具体流程步骤。 一个已付费的开发者账号(账号类型分为个人(Individual)、公司(Company)、企业(Enterprise)、高校(University)四种类型,每年资费分别为$99、$99、$299、免费。)。 一个已经

    2024年02月11日
    浏览(48)
  • FlutterUnit 已上架 iOS,暗色模式全面支持

    一、FlutterUnit 的全平台支持 FlutterUnit 是我的一个开源项目,基于 Flutter 构建的一个 全平台 应用程序。现在很荣幸地宣布: FlutterUnit 已经上架 iOS 的 App Store ,自此主流的几大平台均已提供体验。 项目地址: https://github.com/toly1994328/FlutterUnit 今后,各平台的软件安装包将放在 F

    2024年02月11日
    浏览(43)
  • IOS打包上架AppStore被驳回信息记录

    1:错误码5.2.1错误信息如下 Your app includes content or features from 公司名, or is marketed to control external hardware from 公司名, without the necessary authorization. The inclusion of third-party content within your app, whether retrieved from the internet by the app or embedded in the app, is subject to the terms of the Apple Developer

    2024年02月10日
    浏览(45)
  • iOS App上架全流程及相关处理

    iOS app上架总体流程: 一、IOS上架整个流程 1、申请开发者账号 2、创建APP ID及申请证书 3、itunes connect 创建APP 4、打包 上传APP 5、提交APP,上线成功 1、申请开发者账号 苹果开发者账号主要分为三种:个人账号、公司账号、企业账号,三种账号年费和权限各不相同。开发者账号

    2024年02月07日
    浏览(52)
  • iOS上架报错:无法添加以供审核

    您在提交 app 审核时遇到的问题是因为需要提供版权信息,而您的 app 缺少相关的版权信息。以下是解决此问题的步骤: 确认您是否拥有 app 的版权:在提交 app 之前,您必须确认您拥有 app 的版权或已获得版权持有人的授权。如果您没有版权或未经授权,您将无法通过审核。

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包