FPS指示器是基于CADisplayLink實現(xiàn)的。
CADisplayLink簡介
CADisplayLink是CoreAnimation提供的另一個類似于NSTimer的類酷鸦,它總是在屏幕完成一次更新之前啟動睹逃,它的接口設(shè)計的和NSTimer很類似,所以它實際上就是一個內(nèi)置實現(xiàn)的替代早直,但是和timeInterval以秒為單位不同寥假,CADisplayLink有一個整型的frameInterval屬性,指定了間隔多少幀之后才執(zhí)行霞扬。默認值是1糕韧,意味著每次屏幕更新之前都會執(zhí)行一次。但是如果動畫的代碼執(zhí)行起來超過了六十分之一秒喻圃,你可以指定frameInterval為2萤彩,就是說動畫每隔一幀執(zhí)行一次(一秒鐘30幀)或者3,也就是一秒鐘20次斧拍,等等雀扶。CADisplayLink相比較于NSTimer,幀率足夠連續(xù)肆汹,如果用在動畫上會看起來更加平滑愚墓,但即使CADisplayLink也不能保證每一幀都按計劃執(zhí)行予权,一些失去控制的離散的任務(wù)或者事件(例如資源緊張的后臺程序)可能會導(dǎo)致動畫偶爾地丟幀。當使用NSTimer的時候浪册,一旦有機會計時器就會開啟扫腺,但是CADisplayLink卻不一樣:如果它丟失了幀,就會直接忽略它們议经,然后在下一次更新的時候接著運行斧账。
核心代碼
初始化
@property (nonatomic, strong) CADisplayLink *displayLink;
- (void)setupDisplayLink
{
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkAction:)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
觸發(fā)方法
- (void)displayLinkAction:(CADisplayLink *)displayLink
{
if (self.screenUpdatesBeginTime == 0.0f) {
self.screenUpdatesBeginTime = displayLink.timestamp;
} else {
self.screenUpdatesCount += 1;
CFTimeInterval screenUpdatesTime = self.displayLink.timestamp - self.screenUpdatesBeginTime;
if (screenUpdatesTime >= 1.0) {
CFTimeInterval updatesOverSecond = screenUpdatesTime - 1.0f;
int framesOverSecond = updatesOverSecond / self.averageScreenUpdatesTime;
self.screenUpdatesCount -= framesOverSecond;
if (self.screenUpdatesCount < 0) {
self.screenUpdatesCount = 0;
}
//此處做些更新操作
}
}
}
Demo地址
PS:如果有點幫助的話,希望不要吝嗇你的小星星哦煞肾,謝謝 -0-
如果有誰知道獲取APP占用內(nèi)存的方法(非task_basic_info_data_t)咧织,希望留下寶貴的評論,謝謝0.0