iOS界面卡頓之離屏渲染

? ?導讀:

離屏渲染在開發(fā)中帶來界面卡頓問題一直讓開發(fā)者們頭疼.今天在這里寫一遍關(guān)于離屏渲染的博文.希望大家有所收獲

現(xiàn)在的iOS開發(fā)越來越注重App性能和用戶體驗了.

性能優(yōu)化和內(nèi)存管理是iOS面試中必問的兩道面試題.也是編程中最難的部分之一

要想知道如何解決界面卡頓問題,那你必須對離屏渲染有所了解

要想成為一個高級iOS程序員,你必須學會如何性能優(yōu)化,內(nèi)存優(yōu)化

讀懂了這篇文章,掌握離屏渲染的原理,讓你的App從此遠離卡頓.


OpenGL中,GPU屏幕渲染有以下兩種方式:

一.On-Screen Rendering

? ? ? 意為當前屏幕渲染,指的是GPU的渲染操作是在當前用于顯示的屏幕緩沖區(qū)中進行。

當前屏幕渲染是不需要額外創(chuàng)建新的緩存.也不需要開啟新的上下文.相較與離屏渲染,性能更好.

? ? ? 但是受當前屏幕渲染的局限因素限制(只有自身上下文,屏幕緩存有限等),很對圖形渲染,當前屏幕渲染是解決不了的.這時必須使用到離屏渲染.如何正確的使用離屏渲染,下面會為你詳細描述

二.Off-Screen Rendering

? ? ? 意為離屏渲染,指的是GPU在當前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進行渲染操作。

特殊的“離屏渲染”:CPU渲染

? ? ? 如果我們重 寫了drawRect方法,并且使用任何Core Graphics的技術(shù)進行了繪制操作,就涉及到了CPU渲染。整個渲染過程由CPU在App內(nèi)同步地完成,渲染得到的bitmap(位圖)最后再交由GPU用于 顯示。

普通的離屏渲染

相比于當前屏幕渲染,離屏渲染的代價是很高的,主要體現(xiàn)在兩個方面:

1.創(chuàng)建新緩沖區(qū)

要想進行離屏渲染,首先要創(chuàng)建一個新的緩沖區(qū)。

2.上下文切換

離屏渲染的整個過程,需要多次切換上下文環(huán)境:先是從當前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結(jié)束以后,將離屏緩沖區(qū)的渲染結(jié)果顯示到屏幕上有需要將上下文環(huán)境從離屏切換到當前屏幕。而上下文環(huán)境的切換是要付出很大代價的。

設(shè)置了以下屬性時,都會觸發(fā)離屏繪制:

1.shouldRasterize(光柵化)

2.masks(遮罩)

3.shadows(陰影)

4.edge antialiasing(抗鋸齒)

5.group opacity(不透明)

需要注意的是,如果shouldRasterize被設(shè)置成YES,在觸發(fā)離屏繪制的同時,會將光柵化后的內(nèi)容緩存起來,如果對應的layer及其sublayers沒有發(fā)生改變,在下一幀的時候可以直接復用。這將在很大程度上提升渲染性能。

而其它屬性如果是開啟的,就不會有緩存,離屏繪制會在每一幀都發(fā)生。

在開發(fā)時需要根據(jù)實際情況來選擇最優(yōu)的實現(xiàn)方式,盡量使用On-Screen Rendering。簡單的Off-Screen Rendering可以考慮使用Core Graphics讓CPU來渲染。


如何抉擇

現(xiàn)在擺在我們面前得有三個選擇:當前屏幕渲染、離屏渲染、CPU渲染,該用哪個呢?這需要根據(jù)具體的使用場景來決定。

盡量使用當前屏幕渲染

鑒于離屏渲染、CPU渲染可能帶來的性能問題,一般情況下,我們要盡量使用當前屏幕渲染。

離屏渲染 VS CPU渲染

由于GPU的浮點運算能力比CPU強,CPU渲染的效率可能不如離屏渲染;但如果僅僅是實現(xiàn)一個簡單的效果,直接使用CPU渲染的效率又可能比離屏渲染好,畢竟普通的離屏渲染要涉及到緩沖區(qū)創(chuàng)建和上下文切換等耗時操作。普通的離屏繪制是發(fā)生在繪制服務(是獨立的處理過程)并且同時通過GPU執(zhí)行。當OpengGL的繪制程序在繪制每個layer的時候,有可能因為包含多子層級關(guān)系而必須停下來把他們合成到一個單獨的緩存里。你可能認為GPU應該總是比CPU牛逼一點,但是在這里我們還是需要慎重的考慮一下。因為對GPU來說,從當前屏幕(on-screen)到離屏(off-screen)上下文環(huán)境的來回切換,代價是非常大的。因此對一些簡單的繪制過程來說,這個過程有可能用CoreGraphics,全部用CPU來完成反而會比GPU做得更好。所以如果你正在嘗試處理一些復雜的層級,并且在猶豫到底用-[CALayer?setShouldRasterize:]?還是通過CoreGraphics來繪制層級上的所有內(nèi)容,唯一的方法就是測試并且進行權(quán)衡。

總之,具體的選擇應該由性能測試結(jié)果來決定。

簡而言之:

如果覺得前面的過于抽象,沒看懂,不要緊,把下面的看懂就能正確的解決離屏渲染帶來的界面卡頓的問題了

1.盡量使用當前屏幕渲染,能不使用離屏渲染則盡量不用,你應當盡量避免使用 layer 的 border、corner、shadow、mask 等技術(shù).

2.必須離屏渲染時,相對簡單的視圖應該使用cpu渲染,相對復雜的視圖則使用一般的離屏渲染.

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

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

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