筆記-圓角四種方法的對比以及效能檢測

佐籩發表於2018-11-23

這篇文章是繼筆記-iOS設定圓角方法以及指定位置設圓角文章而寫的,因為上篇文章發出來後,沒有驗證,也有同行的朋友讓我給出一些測試資料來證實一下,所以這裡就給出一下我個人的一些測試資料,正確是否,還請大家作為參考。--------另外,我寫這個僅僅只是自己作為筆記使用,原來都是放在草稿裡的,但是手機版的無法檢視草稿,所以就發出來,沒有想過會有人來看,所以如果有錯誤的內容誤導了大家請原諒,也請發現錯誤的猿友及時幫忙提出,謝謝大家。

Core Animation工具檢測離屏渲染

對離屏渲染的檢測,蘋果為我們提供了一個測試工具Core Animation。可以在Xcode->Open Develeper Tools->Instruments中找到。

先看看第一種方式:通過設定layer的屬性

對UIImageview設定:

無離屏渲染
結果: 無離屏渲染

滾動的幀率:

筆記-圓角四種方法的對比以及效能檢測
結果: 接近60,趨於穩定

對UIButton設定:

離屏渲染
結果: 離屏渲染

滾動的幀率:

筆記-圓角四種方法的對比以及效能檢測

如果低於40幀每秒,普通使用者就會察覺明顯的不流暢,現在這樣app進入垃圾級別體驗了。

官方對離屏渲染產生效能問題也進行了優化:

iOS9.0之前UIImageView跟UIButton設定圓角都會觸發離屏渲染。

iOS9.0之後UIButton設定圓角會觸發離屏渲染,而UIImageView設定圓角不會觸發離屏渲染了,但是如果設定其他陰影效果之類的還是會觸發離屏渲染

第二種方式:使用貝塞爾曲線UIBezierPath和Core Graphics框架畫出一個圓角

對UIImageview設定:
幀率結果:

筆記-圓角四種方法的對比以及效能檢測

對UIButton設定:
幀率結果:

筆記-圓角四種方法的對比以及效能檢測

兩種設定均是無離屏渲染

第三種方式:使用Core Graphics框架畫出一個圓角

對UIImageview設定:
幀率結果:

筆記-圓角四種方法的對比以及效能檢測
對UIButton設定:
幀率結果:
筆記-圓角四種方法的對比以及效能檢測
兩種設定均是無離屏渲染

上面兩種方式均是無離屏渲染,是什麼原因導致了掉幀?

第四種方式:使用CAShapeLayer和UIBezierPath設定圓角

對UIImageview設定:
幀率結果:

筆記-圓角四種方法的對比以及效能檢測
對UIButton設定:
幀率結果:
筆記-圓角四種方法的對比以及效能檢測

兩種都是離屏渲染,掉幀更加嚴重。基本上不能使用。

由上述測試可以知道,我上篇文章裡所記筆記是有問題的。這裡的測試結果可以看的徹底。

新方法:

方法1 還是利用Core Graphics框架

對UIImageView

筆記-圓角四種方法的對比以及效能檢測

幀率結果:

筆記-圓角四種方法的對比以及效能檢測

對UIButton

筆記-圓角四種方法的對比以及效能檢測

幀率結果:

筆記-圓角四種方法的對比以及效能檢測

兩種都是無離屏渲染,不論是對UIImageView,還是對UIButton設定都OK。

方法2 通過混合圖層
此方法就是在要新增的檢視上在疊加一個部分透明的檢視,只對圓角部分進行遮擋。圖層混合的透明度處理方式與mask正好相反。 此方法沒有離屏渲染,沒有額外的CPU計算,但是應用範圍有限。

總結

  • 在可以使用混合圖層遮擋的場景下,優先使用第四種方式。
  • 通過.layer屬性設定,綜合效能上,還是有很大優勢的。
  • 新方法的方法1由於需要大量計算和增加部分記憶體,需要實際情況去使用。

相關文章