前言
今天同事買了一臺(tái)一加8Pro,當(dāng)然話不多說超陆,先拿來給我們研究一下闷叉,看看一加是如何優(yōu)化120Hz屏幕的。
一闲坎、1加7 Pro上90hz的優(yōu)化方案
首先我們先來看看90hz上如何優(yōu)化的,采用的主要方法就是動(dòng)態(tài)調(diào)整整體屏幕幀率都哭,進(jìn)到不同應(yīng)用详民,調(diào)整屏幕幀率,以下是我之前總結(jié)的整體幀率切換的場景涛酗。
我將它命名為:屏幕動(dòng)態(tài)調(diào)整幀率
1.1 小結(jié)
設(shè)置當(dāng)中有60hz和90hz模式選項(xiàng)
設(shè)置為90hz選項(xiàng)之后铡原,正常界面可以一直保持90hz模式,進(jìn)入特定的應(yīng)用或界面自動(dòng)切換到60hz商叹,退出特定的應(yīng)用或界面自動(dòng)切換回90hz
特定的應(yīng)用主要和游戲燕刻,視頻,時(shí)間相關(guān)
二剖笙、1加8 Pro上120hz的優(yōu)化方案
正當(dāng)我也認(rèn)為一加8 Pro上會(huì)采用和1加7 Pro類似的方案的時(shí)候卵洗。我抓了一個(gè)trace,讓我看到了1加8 Pro的另外一種方案。
我將它命名為:應(yīng)用動(dòng)態(tài)調(diào)整幀率
(我相信一加已經(jīng)申請(qǐng)了專利过蹂,如果沒有申請(qǐng)十绑,我覺得我得趕緊寫一個(gè))
2.1 先來看看trace
可以很明顯的看到在同一時(shí)間中,vsync信號(hào)按照120hz上報(bào)
新浪微博按照120hz繪制
狀態(tài)欄按照60hz繪制
我猜這樣子設(shè)計(jì)的原因是:用戶在刷微博的時(shí)候酷勺,讓其他窗口按照60hz繪制本橙,可以讓出更多cpu和gpu資源給微博用,保證用戶刷微博保持120hz脆诉。
2.2 小結(jié)
我推測1加是可能在Choreographer中動(dòng)了一些手腳甚亭,而且我自己大概也可以寫出demo代碼了,可以在不整體調(diào)整屏幕幀率的情況下击胜,讓不同應(yīng)用以任何可以整除120的幀率運(yùn)行亏狰,例如60,30偶摔,40hz暇唾,由于整體幀率又是120hz,也不會(huì)出現(xiàn)長短幀的方案啰挪。
三信不、總結(jié)
通過研究可以發(fā)現(xiàn),一加在90hz和120hz采用了兩種不同的方案亡呵,而且這兩個(gè)方案是可以同時(shí)工作的抽活。只不過同時(shí)運(yùn)行的時(shí)候邏輯會(huì)比較復(fù)雜,暫時(shí)我還不確定1加8 Pro是否會(huì)采用兩種方案同時(shí)使用锰什?因?yàn)槭謾C(jī)已經(jīng)還給同事了下硕。
不管是什么方案,最終目的一致的:就是讓應(yīng)用的每一幀繪制渲染時(shí)間小于一個(gè)時(shí)間周期汁胆。
四梭姓、技術(shù)更新
1.我初步了看了一下代碼,發(fā)現(xiàn)R上新增的setFrameRate的作用主要是標(biāo)記不同的layer的幀率嫩码,可以提升效率sf合成的時(shí)候誉尖,通過遍歷可見的layer
例如發(fā)現(xiàn)在120hz的屏幕上所有的layer的幀數(shù)都是30,sf就只需要按照30hz去刷新铸题。
2.如果控制每一個(gè)應(yīng)用的vsync信號(hào)铡恕,達(dá)到一加8的效果,關(guān)鍵是要調(diào)用EventThread.setVsyncRate接口
這個(gè)接口之前就存在了丢间,只是目前源碼中沒有在應(yīng)用級(jí)別主動(dòng)調(diào)用這個(gè)接口探熔,這個(gè)接口的主要作用是讓vsync信號(hào)按照你要的幀率上報(bào)給app
例如屏幕是120hz的,但是app希望是60hz烘挫,所以只需要setVsyncRate(60),就可以控制單個(gè)應(yīng)用的vsync周期诀艰,可以是<屏幕的幀率的任何值,為了不產(chǎn)生長短幀,建議是屏幕幀率的約數(shù)其垄。
3.但是上述兩個(gè)調(diào)整都不會(huì)影響屏幕的config苛蒲,但是1加手機(jī)進(jìn)入到不同應(yīng)用,會(huì)去整體的設(shè)置新的config到屏幕捉捅,例如120hz和60hz撤防,或者90hz和60hz虽风,如果有錯(cuò)誤的歡迎糾正0艨凇!辜膝!