国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

又卡了~從王者榮耀看Android屏幕刷新機制

移動開發(fā) Android
CPU/GPU每次準備好數(shù)據(jù)后,放到一個單獨的緩存區(qū)backBuffer,當屏幕準備好之后,將backBuffer數(shù)據(jù)和frameBuffer數(shù)據(jù)交換,屏幕只讀取frameBuffer緩存區(qū)的數(shù)據(jù),保證了數(shù)據(jù)的完整連續(xù)性。

[[394575]]

前言

正在帶妹子上分的我,團戰(zhàn)又卡了,我該怎么向妹子解釋?在線等。

“卡”的意思

不管是端游還是手游,我們都會時不時遇到“卡”的時候,一般這個卡有兩種含義:

  • 掉幀

  • 畫面撕裂

那么問題來了,這些情況到底是什么原因導致的?又該怎么解決?

掉幀

首先,要知道幀是什么,幀率又是什么。

幀,就是影像動畫中最小單位的單幅影像畫面,相當于電影膠片上的每一格鏡頭。一幀就是一幅靜止的畫面,連續(xù)的幀就形成動畫,如電視圖象等。

幀率(每秒幀數(shù)),簡單地說,就是在1秒鐘時間里傳輸?shù)膱D片的幀數(shù),也可以理解為圖形處理器每秒鐘能夠刷新幾次,通常用fps(Frames Per Second)表示

這下大家應該知道了,幀就是一個靜止畫面,很多個幀一起就組成了視頻、電影、游戲畫面。

而幀率就是我們游戲常見到的fps,指一秒鐘繪制出現(xiàn)的幀數(shù),單位為“赫茲”(Hz)。

這里簡單科普下,一般要求連貫性的話,幀數(shù)至少要高于每秒約10至12幀的時候,人眼才會認為是連貫的,此現(xiàn)象叫做“視覺暫留現(xiàn)象”,是由人眼的生物構造決定的。通過這個現(xiàn)象,早期的無聲電影通過手搖驅動,將畫面快速播放,就能讓人感覺在播放完整連續(xù)的視頻。

按照我們的認知,這個幀率一般是越大越連貫,就越不卡。但同時,帶來的消耗也就越多,比如電影需要更多的膠卷,電腦需要更好的硬件支持。所以電影一般通用的幀率為24Hz,而電腦、手機一般幀率為60Hz,這樣就能保證正常條件下能讓人舒服得觀看和使用。

那掉幀的意思就很明顯了,本來游戲的fps為60,突然降到了20,也就是一秒只有20幀了,那能不卡嗎?

那么,掉幀原因到底是啥呢?

其實原因大家都知道,不信你繼續(xù)看...

硬件原因

“我這個手機玩游戲卡死了”

“你那啥破手機啊,趕快換一個~”

這個對話應該時常發(fā)生,所以大家也都清楚,硬件的好壞一定程度上決定了玩游戲“卡不卡”,配置高的硬件玩游戲就能保證游戲的流暢。

軟件原因

“你這啥App啊,做的啥游戲啊,這么卡,我這手機配置這么高,就玩你這個卡”

“額,可能是游戲優(yōu)化沒做好,”

第二個原因,就是因為游戲/軟件自身的優(yōu)化就沒做好,圖片弄的很大,布局嵌套太深,那么幀 的計算和渲染就更耗時間,就會有可能導致掉幀。

網(wǎng)絡原因

“不行了,太卡了,我這ping都快1000了,怎么玩啊”

“快換流量啊,團戰(zhàn)要輸了,少個人怎么打”

對了,第三個原因就是網(wǎng)絡原因,這也是最常發(fā)生的原因了,網(wǎng)絡的波動會影響 畫面 的傳輸,所以就會掉幀。

屏幕刷新機制

上述三個原因,其實都涉及到屏幕刷新的基本機制。

在典型的顯示系統(tǒng)中,不管是手機還是電腦,一般都涉及到三個部分:

  • CPU,中央處理器。用于計算數(shù)據(jù),信息處理。
  • GPU,圖形處理器。用于處理圖像圖形,也就是俗稱的顯卡。
  • display,顯示屏幕。用于展示畫面,也就是我們的手機屏幕、電腦顯示器。

整個顯示過程就是:

  • CPU計算屏幕需要的數(shù)據(jù),然后交給GPU。
  • GPU對圖像進行處理繪制,然后存到緩存區(qū)。
  • display再從這個緩存區(qū)讀取數(shù)據(jù),顯示出來。

每一幀都是重復這個工作,也就是1秒中需要60次這樣循環(huán)操作,每次操作需要的時間就約等于16.6ms。也就是我們常說的Android系統(tǒng)中,會每隔16.6ms刷新一次屏幕。

關于屏幕刷新機制,有一張很經(jīng)典的圖片:

可以看到,16.6ms一到,系統(tǒng)就發(fā)送了VSync信號,然后屏幕會從緩存區(qū)獲取了新的一幀圖像并顯示出來,與此同時,CPU也開始了下一幀數(shù)據(jù)的計算,然后計算好交給GPU,最后放到緩存區(qū),等待下一次VSync信號。

VSync信號是啥呢?我們暫且按下不表,待會再說,可以先理解它為一種同步刷新信號,同步CPU和屏幕。當信號來的時候,屏幕開始切換畫面,CPU開始下一幀計算。

為了方便理解,我做了個小動畫:

通過上面的解釋,我們知道了一幀顯示的時間是16.6ms,在這個時間內,CPU和GPU必須把數(shù)據(jù)處理好并放到緩存區(qū)(buffer)中。

如果在某次的16.6ms中,CPU和GPU沒有繪制好下一幀數(shù)據(jù),那么display就無法更新下一幀數(shù)據(jù)了,這就是掉幀。

所以才有了以上三個原因會導致掉幀,再來回顧下:

  • 1、硬件原因。硬件比較差也就是CPU和GPU計算不給力,導致一幀的數(shù)據(jù)沒準備好,所以掉幀。
  • 2、軟件原因。在硬件夠用的情況下,App或者游戲的一幀數(shù)據(jù)計算繁雜,嵌套太多或者圖太大,也會導致下一幀數(shù)據(jù)不能在16.6ms中被準備好,導致掉幀。
  • 3、網(wǎng)絡原因。在硬件軟件都正常情況下,由于網(wǎng)絡波動,CPU的計算數(shù)據(jù)都沒有從網(wǎng)絡上獲取到,那么肯定會導致CPU數(shù)據(jù)的準備延遲,最終導致掉幀。

那么掉幀之后,屏幕刷新機制會怎么處理后續(xù)的幀呢?

  • 如果是游戲的話,因為即時性比較重要,所以丟失的幀就不會再去管了,而是直接準備當前時間應該顯示的內容,最終顯示到屏幕。所以這種情況掉的幀就真的掉了。
  • 如果是應用的話,可能對數(shù)據(jù)的完整性比較重要,所以如果第2幀掉了,那么屏幕就繼續(xù)顯示第1幀,而CPU和GPU繼續(xù)準備第2幀的數(shù)據(jù),如果能在下一個16.6ms內完成第2幀數(shù)據(jù),那么屏幕就會接著顯示第二幀了。比如有時候手機卡的時候,我們去操作App,操作會延遲,就是掉幀了。這種情況幀并不是真的掉了,而是延遲了。

畫面撕裂

接下來就看看畫面撕裂,為什么一幀中會出現(xiàn)兩幀的畫面呢?

首先理解一個概念:「逐行掃描」

「逐行掃描」就是說,顯示器顯示畫面并不是“蹭”一下就打出一張畫面來,而是從上到下一行一行顯示出來的,只不過是顯示得比較快所以肉眼看不出來而已。

之前說了屏幕的數(shù)據(jù)是從緩存區(qū)Buffer中取的,如果在屏幕取數(shù)據(jù)并逐行掃描顯示畫面的過程中,Buffer中的數(shù)據(jù)變了,那么就有可能導致畫面撕裂。

最明顯的例子就是:顯卡的fps是180,而顯示器的fps是60。也就是顯卡一秒鐘能產(chǎn)生180張畫面,而顯示器一秒鐘只能讀取60張畫面。

那么顯示器從Buffer中讀取數(shù)據(jù)逐行掃描的過程中,本來需要1/60 秒顯示完一張畫面,但是在1/180的時間點,顯卡就把下一張畫面的數(shù)據(jù)存到Buffer了,結果顯示器的下半截就顯示的是第二張畫面的內容了。也就造成了畫面撕裂。

再來個動畫解釋下:

所以為了防止這種狀況,一般顯示系統(tǒng)會加入一個雙緩存+垂直同步的概念:

  • 首先,開啟垂直同步,就會將GPU的fps限制為和顯示器的fps一樣。

系統(tǒng)會在顯示器繪制完一幀之后發(fā)送一個垂直同步信號,然后CPU和GPU就準備下一幀的內容,等待顯示器下一幀繪制完,又會發(fā)送一個垂直同步信號。如此反復,就限制了顯卡的fps,按照顯示器的標準來繪制圖像。

這個垂直同步信號就叫做 VSync信號。

玩游戲的朋友應該都知道,很多游戲內設置頁都有 垂直同步 的開啟選項,為的就是將顯卡的fps和顯示器的fps適配,防止畫面撕裂。

  • 其次,通過雙緩存保證一幀數(shù)據(jù)的連貫性。

1、緩存區(qū)backBuffer用于CPU/GPU圖形處理

2、緩存區(qū)frameBuffer用于顯示器顯示

這樣分工明確之后,屏幕只會讀取framebuffer的內容,是一幀完整的畫面。而CPU/GPU計算的新一幀內容會放到backbuffer中,不會影響到framebuffer的內容。

只有當屏幕繪制完一幀內容之后,才會將CPU/GPU計算好的新一幀內容也就是backbuffer內容和framebuffer進行交換。

這樣就保證了一幀數(shù)據(jù)的完整連貫。

小結下就是:當屏幕掃描完第1幀畫面之后,系統(tǒng)發(fā)送VSync信號,這時會發(fā)生三件事:

  • 1、交換兩個緩存區(qū)(framebuffer、backbuffer)內容。
  • 2、顯示器開始顯示第2幀內容,也就是交換后的framebuffer內容。
  • 3、CPU/GPU開始計算處理第三幀的內容,并在處理好內容后放到backbuffer中。

再來個動畫:

Android Project Butter(黃油計劃)

問題都解決了嗎?并沒有。

加入VSync信號之后,掉幀問題變得更嚴重了:

可以發(fā)現(xiàn),加入了VSync信號后,雖然統(tǒng)一了CPU處理的時間點,但是掉幀問題可能會被再一次放大,從掉一幀直接變成后續(xù)一直掉幀。因為第二個的16.6ms被浪費了,CPU必須等到第三個16.6ms才能開始新一幀的數(shù)據(jù)處理,直接影響后續(xù)的所有幀進度。

怎么辦呢?在保留VSync信號的同時有可能最大利用上CPU/GPU嗎?

三緩存來了:

1、緩存區(qū)backBuffer用于CPU/GPU圖形處理

2、緩存區(qū)TripleBuffer用于CPU/GPU圖形處理

3、緩存區(qū)frameBuffer用于顯示器顯示

剛才說的情況導致的原因就是因為在第二個VSync信號來的時候,因為backBuffer被GPU占用,所以CPU無法去開始新一幀的計算。

加入了第三個緩存區(qū),那么在第二個VSync信號來的時候,CPU就可以利用TripleBuffer開始新一幀的計算,而無視正在被GPU占用的backBuffer。

你可以理解為 CPU、GPU、Display每個人都有一個緩存區(qū),這樣三個就能同時做自己的事而互不影響,最大化利用每個模塊。

三緩存和上面說到的Vsync同步信號都是 Android 4.1 發(fā)布的一個Project Butter(黃油計劃)中提出的,為的是就是讓Android能讓黃油/奶油般順滑。

最后貼個三緩存機制下的刷新機制圖:

小結

今天了解了Android系統(tǒng)的刷新機制,雖然沒有代碼,但是面試中也是常常被問到的,再次總結下:

1、為了解決畫面撕裂問題,引入了垂直同步信號VSync信號和雙緩存。

每次VSync信號到達的時候,屏幕進行畫面切換,CPU/GPU開始準備下一幀內容。

CPU/GPU每次準備好數(shù)據(jù)后,放到一個單獨的緩存區(qū)backBuffer,當屏幕準備好之后,將backBuffer數(shù)據(jù)和frameBuffer數(shù)據(jù)交換,屏幕只讀取frameBuffer緩存區(qū)的數(shù)據(jù),保證了數(shù)據(jù)的完整連續(xù)性。

2、為了解決VSync信號下CPU/GPU無法最大化利用的問題,引入了三緩存。

當VSync信號來的時候,即使GPU還沒處理好上一幀數(shù)據(jù),backBuffer還不空閑,但是CPU也可以利用第三個緩存區(qū)正常開始處理下一幀的數(shù)據(jù),最大化利用CPU/GPU,保證垂直同步機制的同時不浪費資源。

3、掉幀的根本原因是因為在一幀時間內(一般為16.6ms),CPU/GPU無法把下一幀的數(shù)據(jù)準備好。

即使引用了三緩存和垂直同步,但是掉幀的情況該發(fā)生還是會發(fā)生,我們作為App軟件開發(fā)者,能做的就是盡可能優(yōu)化布局,減少嵌套,減少CPU/GPU計算畫面數(shù)據(jù)的時間,讓每一幀時間內正常準備好下一幀圖像數(shù)據(jù)。

至于刷新機制在Android源碼中到底是怎么實現(xiàn)的呢?下期會帶來Choreographer的解析。

參考

https://www.jianshu.com/p/0d00cb85fdf3

https://www.zhihu.com/question/49764664/answer/469342536 

https://blog.csdn.net/yangwen123/article/details/16344375

 

責任編輯:武曉燕 來源: 碼上積木
相關推薦

2021-12-08 06:53:28

Choreograph屏幕機制

2011-07-15 09:57:03

MongoDB緩存刷新

2025-08-06 07:47:22

2020-10-13 08:36:30

React 架構機制

2017-08-30 12:17:02

Python王者榮耀套路

2025-05-07 08:00:00

刷新令牌自動續(xù)簽FastAPI

2025-09-02 10:03:34

2010-09-06 08:43:13

.NET 4

2017-07-10 14:20:45

2020-09-21 14:35:20

VuenextTick前端

2010-03-10 11:55:30

Mocha BSM運維管理摩卡軟件

2023-07-06 13:30:47

2019-05-27 08:09:43

WiFi無線信道上網(wǎng)

2010-06-02 11:33:26

Linux 內存監(jiān)控

2024-01-03 21:50:32

緩存機制請求

2017-10-30 08:20:16

王者榮耀騰訊云游戲

2017-11-27 11:02:46

高并發(fā)突發(fā)池系統(tǒng)架構王者榮耀

2017-11-21 09:25:23

2025-04-27 02:33:00

epoll核心機制服務器

2017-12-25 16:20:40

Python自動化王者榮耀
點贊
收藏

51CTO技術棧公眾號

欧美日韩中字一区| 夜色福利刺激| 亚洲成人tv网| 国产亚洲字幕| 欧美日韩一区二区视频在线| 国产精品国产自产拍高清av王其| av影片在线| 亚洲自拍小视频免费观看| 久久免费偷拍视频| 欧美日韩在线观看首页| 成人a在线视频| 亚洲国产电影在线观看| 午夜影院在线播放| 国产精品免费一区二区三区观看| 亚洲色图19p| 精品一区二区三区中文字幕视频| 宅男噜噜99国产精品观看免费| 亚洲特级片在线| 欧美国产中文高清| 欧美一区二区激情| 亚洲福利视频在线| 亚洲一区二区三区四区五区午夜| 亚洲福利二区| 国产精品日韩欧美综合| 中文字幕五月欧美| 成人免费在线电影网| 无码aⅴ精品一区二区三区浪潮 | 一区二区三区四区在线视频| 欧美日韩国产专区| 免费成人av| 3344永久| 国内伊人久久久久久网站视频 | 久国产精品韩国三级视频| jizz在线观看中文| 成人在线激情视频| 亚洲成人自拍网| 在线日韩一区| 天天操夜夜干| 欧美一级淫片播放口| 中文字幕乱码一区二区免费| 日本少妇精品亚洲第一区| 日本a级片在线播放| 欧美一级精品大片| 妖精视频成人观看www| 麻豆视频在线播放| 国产欧美日韩在线播放| 欧美日韩日日摸| 久久久久久网| 国产自产自拍视频在线观看| 一区二区精品在线| 中国china体内裑精亚洲片| 成人h版在线观看| 你懂得影院夜精品a| 国产a级黄色大片| 欧美成人亚洲成人| 亚洲一区二区三区四区在线免费观看 | 日韩不卡一区| 大乳在线免费观看| 精品一区二区成人免费视频| 伦伦影院午夜日韩欧美限制| 亚洲国产视频直播| 亚洲一区国产| 亚洲性视频在线| 国产视频网址在线| 欧美精品久久久久久久久久久| 日韩av电影在线播放| 91精品在线观看入口| 91香蕉视频mp4| 天天揉久久久久亚洲精品| 国产区美女在线| 浓精h攵女乱爱av| 国产区一区二区| 久久久精品一区| 在线国产电影不卡| 99视频国产精品| 亚洲午夜久久久久久尤物| 国产第一亚洲| 亚洲成人av高清| 免费在线看黄色片| 亚洲伊人一本大道中文字幕| 中文字幕日本精品| 一本色道**综合亚洲精品蜜桃冫| 韩国三级在线一区| 97精品中文字幕| 日韩av电影资源网| 电影在线一区| 中文字幕在线导航| 色综合电影网| 国产精品一区二区三区免费视频 | 综合激情国产一区| 一区二区三区四区视频精品免费 | 日本大片在线观看| 97伦理在线四区| www国产免费| 97最新国自产拍视频在线完整在线看| 午夜小视频福利在线观看| 伊人久久视频| 性欧美长视频| 91啦中文在线观看| 91国产免费看| 欧美激情亚洲精品| 国产成人丝袜美腿| 在线观看视频你懂的| 成人短视频在线看| 欧美专区国产专区| 国产亚洲欧洲高清一区| 色视频成人在线观看免| 成人免费毛片片v| 国产精品激情| 国产精东传媒成人av电影| 欧美人与性动交α欧美精品图片| xxxxx中文字幕| 久久久久久久久久网| 国产一区二区视频在线免费观看| 久久青草福利网站| 一本一道久久a久久精品逆3p| 欧美亚洲动漫制服丝袜| 国产精品免费丝袜| 国产在线视频一区二区| 欧美午夜a级限制福利片| 天堂99x99es久久精品免费| 久久久一本精品| 欧美成人精品一区二区男人看| 91激情视频在线| 一二三四中文字幕| 精品综合久久| 国产在线播放91| 欧美激情伊人电影| 国产午夜精品全部视频播放| 在线观看91av| 欧美性猛交xxxx乱大交极品| 中文字幕中文乱码欧美一区二区| 成人涩涩免费视频| 激情文学综合丁香| www在线看| 激情成人在线视频| 91久久精品国产91性色| 成人影院免费观看| 精品网站aaa| 亚洲最大的网站| 激情综合婷婷| 日韩国产高清在线| 欧美精品在线视频观看| 男女曰b免费视频| 天堂精品中文字幕在线| 欧美精品在线免费观看| 2018高清国产日本一道国产| 91精品国产91久久综合| 国产精品视频一二三| 激情欧美丁香| 激情五月综合网| 欧美三级电影在线| 日韩精品亚洲专区在线观看| 成人av集中营| 亚洲第一二三四区| 欧洲一区二区三区精品| 97超碰在线免费| 麻豆av在线播放| 18视频在线观看| 成人黄色网址| 老司机午夜在线视频| 欧美jizzhd欧美| a视频在线免费看| av免费网站在线观看| av在线免费网站| av大片在线| 99色在线观看| 波多野结衣久久精品| 丝袜美腿一区| 日本一区二区三区中文字幕 | 国产成人精品一区| 日韩av电影手机在线| 91成人在线观看国产| 2023亚洲男人天堂| 91免费版在线| 24小时成人在线视频| 欧美特大特白屁股xxxx| 精品国模一区二区三区| 国产精品天堂蜜av在线播放| 国产人妖一区| jazzjazz国产精品久久| 天堂综合网久久| 欧美一区三区| 国语自产精品视频在线看8查询8| 欧美午夜不卡| 日韩影院精彩在线| 国产另类ts人妖一区二区| 国产91对白在线观看九色| youjizz久久| 亚洲欧洲av色图| 欧美午夜影院在线视频| 欧美日韩国产一级二级| 欧美sm极限捆绑bd| 亚洲色图25p| 久久久久久久久久久免费精品| 日韩av免费看网站| 97人人香蕉| 一本—道久久a久久精品蜜桃| 免费无码不卡视频在线观看| 2018av男人天堂|