屏幕撕裂
iOS是雙緩沖機(jī)制离熏,雙緩沖雖然能解決效率問題荚板,但會(huì)引入一個(gè)新的問題。當(dāng)視頻控制器還未讀取完成時(shí)谒拴,即屏幕內(nèi)容剛顯示一半時(shí)尝江,GPU 將新的一幀內(nèi)容提交到幀緩沖區(qū)并把兩個(gè)緩沖區(qū)進(jìn)行交換后,視頻控制器就會(huì)把新的一幀數(shù)據(jù)的下半段顯示到屏幕上英上,造成畫面撕裂現(xiàn)象炭序,如下圖:
針對(duì)這個(gè)問題,GPU通常會(huì)做垂直同步苍日,GPU 會(huì)等待顯示器的垂直同步信號(hào)發(fā)出后惭聂,才進(jìn)行新的一幀渲染和緩沖區(qū)更新。這樣能解決畫面撕裂現(xiàn)象相恃,也增加了畫面流暢度辜纲,但需要消費(fèi)更多的計(jì)算資源,也會(huì)帶來部分延遲±鼓停現(xiàn)在iOS 設(shè)備會(huì)始終使用雙緩存耕腾,并開啟垂直同步
關(guān)于卡頓的簡單原理解釋:
V-Sync
V-Sync 的主要作用就是保證只有在幀緩沖區(qū)中的圖像被渲染之后,后備緩沖區(qū)中的內(nèi)容才可以被拷貝到幀緩沖區(qū)中
杀糯,理想情況下的 V-Sync 會(huì)按這種方式工作:
每次 V-Sync 發(fā)生時(shí)扫俺,CPU 以及 GPU 都已經(jīng)完成了對(duì)圖像的處理以及繪制,顯示器可以直接拿到緩沖區(qū)中的幀固翰。但是狼纬,如果 CPU 或者 GPU 的處理需要的時(shí)間較長,就會(huì)發(fā)生掉幀的問題:
在 V-Sync 信號(hào)發(fā)出時(shí)骂际,CPU 和 GPU 并沒有準(zhǔn)備好需要渲染的幀疗琉,顯示器就會(huì)繼續(xù)使用當(dāng)前幀,這就加劇了屏幕的顯示問題歉铝,而每秒顯示的幀數(shù)會(huì)少于 60盈简。
由于會(huì)發(fā)生很多次掉幀,在開啟了 V-Sync 后太示,40 ~ 50 FPS 的渲染頻率意味著顯示器輸出的畫面幀率會(huì)從 60 FPS 急劇下降到 30 FPS柠贤,原因在這里不會(huì)解釋,讀者可以自行思考先匪。
其實(shí)到這里關(guān)于屏幕渲染的內(nèi)容就已經(jīng)差不多結(jié)束了,根據(jù) V-Sync 的原理弃衍,優(yōu)化應(yīng)用性能呀非、提高 App 的 FPS 就可以從兩個(gè)方面來入手,優(yōu)化 CPU 以及 GPU 的處理時(shí)間。
卡頓解決的主要思路:
盡可能減少CPU岸裙、GPU資源的消耗猖败。
按照60FPS的刷幀率,每隔16ms就會(huì)有一次VSync信號(hào)降允。