iOS Runloop和CADisplayLink 在輸入和輸出中的性能優(yōu)化

一、runloop線程?;?/h1>

1.1 線程?;畹淖饔茫?/h2>

使用子線程時,如果任務(wù)非常頻繁,如檢測網(wǎng)絡(luò)狀態(tài),縮放,拖動等觸發(fā)的事件,切換不同子線程會消耗大量cpu,如果是同一個常駐線程則可以避免該問題

1.2 在線程中啟動一個runloop

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(runLoopThreadEntryPoint:) object:nil];
[thread start];

//實現(xiàn)線程入口方法:在線程入口方法中,創(chuàng)建并啟動一個 RunLoop。例如
- (void)runLoopThreadEntryPoint:(id)object {
    @autoreleasepool {
        // Create an autoreleased NSRunLoop object
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        self.runloop = runloop;
        // Add an input source to the run loop (for example, a timer or a custom input source)
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        
        // Run the run loop
        [runLoop run];
      
    }
}

1.3 插入任務(wù)

[NSObject performSelector: @selector(log) onThread: thread withObject: obj waitUntilDone: NO];
  [runLoop performBlock:^{
       if (block) block();
       if (completion) completion();
       dispatch_async(dispatch_get_main_queue(), ^{
           self.renderTaskCount--;
           if (isDrawBlock) [self flush];
       });
   }];

二、 CADisplayLink 同步屏幕刷新

前面大量任務(wù)產(chǎn)生結(jié)果,需要密集刷新顯示時,可以使用CADisplayLink優(yōu)化, CADisplayLink 與NStimer類似,不過前者同步屏幕刷新時間,如60hz的調(diào)用周期時1/60s

CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkCallback:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
- (void)displayLinkCallback:(CADisplayLink *)displayLink {
   // 在這里執(zhí)行需要執(zhí)行的任務(wù),例如更新界面或者計算動畫狀態(tài)
}

三、其他

在多個任務(wù)持續(xù)輸入或輸出數(shù)據(jù)中,可以添加bool標(biāo)識,即前一個任務(wù)未執(zhí)行完之前,下一個任務(wù)則跳過

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容