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

一、runloop線程?;?/h1>

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

使用子線程時,如果任務非常頻繁,如檢測網絡狀態(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 插入任務

[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 同步屏幕刷新

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

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

三、其他

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

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容