這篇文章是繼筆記-iOS設定圓角方法以及指定位置設圓角文章而寫的,因為上篇文章發出來後,沒有驗證,也有同行的朋友讓我給出一些測試資料來證實一下,所以這裡就給出一下我個人的一些測試資料,正確是否,還請大家作為參考。--------另外,我寫這個僅僅只是自己作為筆記使用,原來都是放在草稿裡的,但是手機版的無法檢視草稿,所以就發出來,沒有想過會有人來看,所以如果有錯誤的內容誤導了大家請原諒,也請發現錯誤的猿友及時幫忙提出,謝謝大家。
Core Animation工具檢測離屏渲染
對離屏渲染的檢測,蘋果為我們提供了一個測試工具Core Animation。可以在Xcode->Open Develeper Tools->Instruments中找到。
先看看第一種方式:通過設定layer的屬性
對UIImageview設定:
![無離屏渲染](https://i.iter01.com/images/cff4886ed2c672bd8d0ee8c2ac9756b7b71e0dd37e167bce3af1397e980b491b.png)
滾動的幀率:
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/cb3740eca690d6a34f8eff9b6d6bf70a50095bd2677964fc38c0f093eb3a80ae.png)
對UIButton設定:
![離屏渲染](https://i.iter01.com/images/c4ceb5b7a159b7c00c8bc497ce6ba2fdb33c69cb30c9f1c8b3ad1ae7fb251860.png)
滾動的幀率:
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/457d3bdb725289fc6eacca8b4c300467f2dc7420671df52a6632c3f414f158e8.png)
如果低於40幀每秒,普通使用者就會察覺明顯的不流暢,現在這樣app進入垃圾級別體驗了。
官方對離屏渲染產生效能問題也進行了優化:
iOS9.0之前UIImageView跟UIButton設定圓角都會觸發離屏渲染。
iOS9.0之後UIButton設定圓角會觸發離屏渲染,而UIImageView設定圓角不會觸發離屏渲染了,但是如果設定其他陰影效果之類的還是會觸發離屏渲染
第二種方式:使用貝塞爾曲線UIBezierPath和Core Graphics框架畫出一個圓角
對UIImageview設定:
幀率結果:
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/2ab1b27f5f202fd777db9521168d2523ba06dde324d5d26c3cab5025b5872398.png)
對UIButton設定:
幀率結果:
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/0c99cb760a69f6e65e5e4b5e5b297f2b2ddb59ee0c7e45d55d452fdcad4df0ec.png)
兩種設定均是無離屏渲染
第三種方式:使用Core Graphics框架畫出一個圓角
對UIImageview設定:
幀率結果:
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/f6064574183090e081f13f5a9dfccbc1dfbd0d6a3bc0b1a92e7631be785de1ff.png)
幀率結果:
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/4aa630a9a6a03b6185b81b4e533b086fd42e98ee9704c334c320aa9afc58c9b7.png)
上面兩種方式均是無離屏渲染,是什麼原因導致了掉幀?
第四種方式:使用CAShapeLayer和UIBezierPath設定圓角
對UIImageview設定:
幀率結果:
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/90215a374c4a5d1e06e18c07f389673d0846d53c8b359bf97e495e9ede8f18f2.png)
幀率結果:
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/f9cba0508a4b7eb98e4ee1065070feb08a30242c87f4e72f87b744743a5fad13.png)
兩種都是離屏渲染,掉幀更加嚴重。基本上不能使用。
由上述測試可以知道,我上篇文章裡所記筆記是有問題的。這裡的測試結果可以看的徹底。
新方法:
方法1 還是利用Core Graphics框架
對UIImageView
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/cf8780c63040e16ffddca4f60ae90a952328cbb0db39043d1bf4857188d611cf.png)
幀率結果:
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/08bfda4e8a66b4d18d01f2367d78fff7ee86c2c6a7ac441321abbc6c46859e43.png)
對UIButton
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/68d4cbbaab87538add32855bd1219a787258b6c1c45fa104af3862628f35c0ba.png)
幀率結果:
![筆記-圓角四種方法的對比以及效能檢測](https://i.iter01.com/images/858b73a45d359504eda755f87de7903033c71de17fe7263f55e241807eb072ff.png)
兩種都是無離屏渲染,不論是對UIImageView,還是對UIButton設定都OK。
方法2 通過混合圖層
此方法就是在要新增的檢視上在疊加一個部分透明的檢視,只對圓角部分進行遮擋。圖層混合的透明度處理方式與mask正好相反。
此方法沒有離屏渲染,沒有額外的CPU計算,但是應用範圍有限。
總結
- 在可以使用混合圖層遮擋的場景下,優先使用第四種方式。
- 通過.layer屬性設定,綜合效能上,還是有很大優勢的。
- 新方法的方法1由於需要大量計算和增加部分記憶體,需要實際情況去使用。