CPU 資源消耗原因和解決方案

2021-07-09 14:02:27 字數 2576 閱讀 3615

1>物件建立

物件的建立會分配記憶體、調整屬性、甚至還有讀取檔案等操作,比較消耗 cpu 資源。盡量用輕量的物件代替重量的物件,可以對效能有所優化。比如 calayer 比 uiview 要輕量許多,那麼不需要響應觸控事件的控制項,用 calayer 顯示會更加合適。如果物件不涉及 ui 操作,則盡量放到後台執行緒去建立,但可惜的是包含有 calayer 的控制項,都只能在主線程建立和操作。通過 storyboard 建立檢視物件時,其資源消耗會比直接通過**建立物件要大非常多,在效能敏感的介面裡,storyboard 並不是乙個好的技術選擇。

盡量推遲物件建立的時間,並把物件的建立分散到多個任務中去。儘管這實現起來比較麻煩,並且帶來的優勢並不多,但如果有能力做,還是要盡量嘗試一下。如果物件可以復用,並且復用的代價比釋放、建立新物件要小,那麼這類物件應當盡量放到乙個快取池裡復用。

2>

物件調整

物件的調整也經常是消耗 cpu 資源的地方。這裡特別說一下 calayer:calayer 內部並沒有屬性,當呼叫屬性方法時,它內部是通過執行時 resolveinstancemethod 為物件臨時新增乙個方法,並把對應屬性值儲存到內部的乙個 dictionary 裡,同時還會通知 delegate、建立動畫等等,非常消耗資源。uiview 的關於顯示相關的屬性(比如 frame/bounds/transform)等實際上都是 calayer 屬性對映來的,所以對 uiview 的這些屬性進行調整時,消耗的資源要遠大於一般的屬性。對此你在應用中,應該儘量減少不必要的屬性修改。

當檢視層次調整時,uiview、calayer 之間會出現很多方法呼叫與通知,所以在優化效能時,應該盡量避免調整檢視層次、新增和移除檢視。

3>物件銷毀

物件的銷毀雖然消耗資源不多,但累積起來也是不容忽視的。通常當容器類持有大量物件時,其銷毀時的資源消耗就非常明顯。同樣的,如果物件可以放到後台執行緒去釋放,那就挪到後台執行緒去。這裡有個小 tip:把物件捕獲到 block 中,然後扔到後台佇列去隨便傳送個訊息以避免編譯器警告,就可以讓物件在後台執行緒銷毀了。

nsarray *tmp = self.array;

self.array = nil;

dispatch_async(queue, ^);

4>布局計算

不論通過何種技術對檢視進行布局,其最終都會落到對 uiview.frame/bounds/center 等屬性的調整上。上面也說過,對這些屬性的調整非常消耗資源,所以盡量提前計算好布局,在需要時一次性調整好對應屬性,而不要多次、頻繁的計算和調整這些屬性。

5>autolayout

autolayout 是蘋果本身提倡的技術,在大部分情況下也能很好的提公升開發效率,但是 autolayout 對於複雜檢視來說常常會產生嚴重的效能問題。隨著檢視數量的增長,autolayout 帶來的 cpu 消耗會呈指數級上公升。具體資料可以看這個文章: 如果你不想手動調整 frame 等屬性,你可以用一些工具方法替代(比如常見的 left/right/top/bottom/width/height 快捷屬性),或者使用 componentkit、asyncdisplaykit 等框架。

6>文字計算

如果你用 coretext 繪製文字,那就可以先生成 coretext 排版物件,然後自己計算了,並且 coretext 物件還能保留以供稍後繪製使用。

7>文字渲染

螢幕上能看到的所有文字內容控制項,包括 uiwebview,在底層都是通過 coretext 排版、繪製為 bitmap 顯示的。常見的文字控制項 (uilabel、uitextview 等),其排版和繪製都是在主線程進行的,當顯示大量文字時,cpu 的壓力會非常大。對此解決方案只有乙個,那就是自定義文字控制項,用 textkit 或最底層的 coretext 對文字非同步繪製。儘管這實現起來非常麻煩,但其帶來的優勢也非常大,coretext 物件建立好後,能直接獲取文字的寬高等資訊,避免了多次計算(調整 uilabel 大小時算一遍、uilabel 繪製時內部再算一遍);coretext 物件占用記憶體較少,可以快取下來以備稍後多次渲染。

8>的解碼

當你用 uiimage 或 cgimagesource 的那幾個方法建立時,資料並不會立刻解碼。設定到 uiimageview 或者 calayer.contents 中去,並且 calayer 被提交到 gpu 前,cgimage 中的資料才會得到解碼。這一步是發生在主線程的,並且不可避免。如果想要繞開這個機制,常見的做法是在後台執行緒先把繪製到 cgbitmapcontext 中,然後從 bitmap 直接建立。目前常見的網路庫都自帶這個功能。

9>影象的繪製

影象的繪製通常是指用那些以 cg 開頭的方法把影象繪製到畫布中,然後從畫布建立並顯示這樣乙個過程。這個最常見的地方就是 [uiview drawrect:] 裡面了。由於 coregraphic 方法通常都是執行緒安全的,所以影象的繪製可以很容易的放到後台執行緒進行。乙個簡單非同步繪製的過程大致如下(實際情況會比這個複雜得多,但原理基本一致):

- (void)display );

});}

IOS CPU資源消耗原因和解決方案

ios cpu資源消耗原因和解決方案 1.物件建立.物件的建立會分配記憶體 調整屬性 甚至還有讀取檔案等操作,比較消耗 cpu 資源。盡量用輕量的物件代替重量的物件,可以對效能有所優化。比如 calayer 比 uiview 要輕量許多,那麼不需要響應觸控事件的控制項,用 calayer 顯示會更加...

造成死鎖的原因和解決方案

計算機系統中,如果系統的資源分配策略不當,更常見的可能是程式設計師寫的程式有錯誤等,則會導致程序因競爭資源不當而產生死鎖的現象。產生死鎖的原因主要是 1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就...

CPU飆高原因及解決方案

一 cpu飆高原因 1.大量中斷 中斷分為軟中斷 軟中斷是一種需要核心為正在執行的進行去做一些事情的請求 和硬中斷 外部引起的 2.系統負載高 負載高表示有很多程式等待排程執行,它會導致上下文切換頻繁 3.上下文切換頻繁 二 排查 1.top命令檢視占用cpu的pid 2.top h p pid 查...