首页 > 白话Cocoa > 关于App Nap、Automatic Termination、Sudden Termination

关于App Nap、Automatic Termination、Sudden Termination

App Nap

2013年苹果发布的最新13英寸MacBook Pro Retina,可以说是目前最接近完美的Pro了,再加上免费的10.9操作系统,体验一如既往地好。
电池的续航能力对于笔记本电脑的便携性来说至关重要,今天苹果笔记本续航能力有了很大的提升。硬件方面得益于英特尔Haswell处理器,软件方面是得益于10.9操作系统采用了一种更加省电的技术,叫app nap。

app nap技术在os x 10.9才引进的,系统对所有程序默认启用app nap。它能够智能地安排用户的使用进程,使未使用的App进入休眠状态,最多可降低约72%的CPU占用率,从而达到节省电池消耗的目的,进一步提升设备续航能力。今年开发者大会,苹果的技术总监演示的一种视频让我印象深:当一个safari网页在播放flash的时候,该flash占用很多的cpu跟资源,而使用其它窗口来覆盖住该flash后,cpu占用率降低了很多。

只要程序同时满足下列四种条件,app nap就会生效
1、程序窗口不可见——也就是程序的窗口被其它程序的窗口挡住或者程序最小化隐藏到dock,该程序不在前台。
2、程序没有在播放声音
3、没有阻止自动关闭(automatic termination)
4、没有其它电源设置的自定义
当这些条件都满足的时候,os x就会让程序进入睡眠,程序被挂在一个后台计划队列里面很获得极小的cpu占用率。直到我们再次激活程序窗口的时候,程序才被唤醒

app nap可以通过挂起程序的方式来达到省电,如果你的程序满足上面的那四个条件就会触发app nap,而如果同时你的程序正在处理一些重要的任务,比如正在挂机下载,或者正在计算下一步的象棋要走哪一步,你当然不希望程序被app nap架空挂起。

为了阻止程序在处理一些重要的任务时被挂起而进入休眠状态,可以通过 NSProcessInfo类的这两个函数—beginActivityWithOptions:reason:, endActivity:来实现。

首先在执行任务之前,通过 beginActivityWithOptions来disable app nap,告诉系统这个程序是处于激活状态,不要挂起我。

......
@property (strong) id activity;
......
//这个api是10.9才引入的,所以要先判断该Api是否存在,存在才调用
        if ([[NSProcessInfo processInfo] respondsToSelector:@selector(beginActivityWithOptions:reason:)]) {
            if (self.activity == nil) {
                self.activity = [[NSProcessInfo processInfo] beginActivityWithOptions:NSActivityUserInitiatedAllowingIdleSystemSleep
                                                                               reason:@"disable app nap"];
            }
        }

//然后接着do important work

//当任务处理完后,再enable app nap
       if (self.activity) {
            [[NSProcessInfo processInfo] endActivity:self.activity];
            self.activity = nil;
        }

这样可以确保在处理重要任务的时候程序不被挂起,而任务完成后,程序可以被挂起。

如果你遇到一些app nap的问题,想要完全禁用app nap来进行调试,可以通过下面命令行来禁用
defaults write NSAppSleepDisabled -bool YES
同时也可以通过右键该程序,在显示简介里面,将app nap的check box勾掉来禁用app nap

自动终止(Automatic Termination)

自动终止技术在OS X10.7的时候才引进的。
我们在第一次使用iphone的时候,会有一种惊喜。老乔说过,苹果非常鼓励用户打开了程序,然后不需要再繁琐地再去一个一个关闭程序,而是让这些程序一直处于打开状态。天啊,打开程序就不需要再去关闭程序,而且不用担心性能问题,听起来就非常cool。当听到老乔很自信说这句话的时候,我作为一个用户反而不自信起来,因为我弄不明白其中的原理而担心会影响到性能问题。
当今天研究了os x能源节省技术后,终于知道其中使用的技术非常简单,叫自动终止技术:Automatic termination
用户可以通过选择应用程序菜单里的退出命令来终止应用程序,类似于IOS系统,OS X操作系统也可以智能化地来管理程序的退出,而不需要用户来手动退出程序,这门技术叫自动终止技术。自动终止技术允许系统杀死已经不再使用的应用程序跟后台进程来回收所需的资源,比如内存,并且让该程序的图标保留在dock上,看起来就像还在继续运行一样,完全不需要用户去手动退出。而当用户再次点击dock的图标时,就会再次激活程序。可以说这种技术是为了优化用户体验而产生的。

跟自动终止技术相关的函数,是NSProcess类里面的四函数,有兴趣的读者可以继续研究。

disableAutomaticTermination:
enableAutomaticTermination:
setAutomaticTerminationSupportEnabled:
automaticTerminationSupportEnabled

程序默认是disableAutomaticTermination状态,配置 Info.plist里面的键值为YES,相当于在程序启动的时候调用enableAutomaticTermination函数。

突然终止(Sudden Termination)

突然终止技术OS X10.6以及之后版本才引入的
我们可以禁用或者启用sudden termination来决定程序是否可以被快速结束掉。突然终止技术,允许系统可以快速结束程序,甚至不需要发送关闭的消息给程序。用于优化操作系统用户登出,关机跟重启的时间。

跟自动终止技术相关的两个函数,是NSProcess类里面的这两个函数。

disableSuddenTermination
enableSuddenTermination

程序默认是disableSuddenTermination状态,配置 Info.plist里面的NSSupportsSuddenTermination键值为YES,相当于在程序启动的时候调用enableSuddenTermination函数。
NSUserDefaults使用这两个函数来确保正在写入配置到plist的时候,程序不被系统终止,而是在配置写入到plist后,才被正常终止。

参考资料:

https://developer.apple.com/library/mac/releasenotes/MacOSX/WhatsNewInOSX/Articles/MacOSX10_9.html

https://developer.apple.com/library/mac/documentation/General/Conceptual/MOSXAppProgrammingGuide/CoreAppDesign/CoreAppDesign.html#//apple_ref/doc/uid/TP40010543-CH3-SW27

https://developer.apple.com/library/mac/documentation/General/Conceptual/MOSXAppProgrammingGuide/CoreAppDesign/CoreAppDesign.html#//apple_ref/doc/uid/TP40010543-CH3-SW28

https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/Classes/NSProcessInfo_Class/Reference/Reference.html

(转载本站文章请注明出处 www.helloitworks.com ,请勿用于任何商业用途)

分类: 白话Cocoa 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.