日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

電子發(fā)燒友App

硬聲App

掃碼添加小助手

加入工程師交流群

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>人工智能>?在 Android 上進(jìn)行高刷新率渲染

?在 Android 上進(jìn)行高刷新率渲染

2021-03-08 | pdf | 178.55KB | 次下載 | 2積分

資料介紹

作者:Ady Abraham, Software Engineer
來(lái)源:谷歌開發(fā)者

長(zhǎng)久以來(lái),手機(jī)屏幕刷新率都是 60Hz。應(yīng)用和游戲開發(fā)者也習(xí)慣了假定刷新率為 60Hz,也就是每 16.6ms 生成一幀,而且這樣開發(fā)出來(lái)的應(yīng)用和游戲都會(huì)正常進(jìn)行。但現(xiàn)在的情況已經(jīng)不同了。最新的旗艦級(jí)設(shè)備往往會(huì)搭載刷新率更高的屏幕,可以帶來(lái)更流暢的動(dòng)畫效果、更低的延遲,從而獲得更好的整體用戶體驗(yàn)。還有一些設(shè)備支持可變刷新率,比如 Pixel 4,它支持 60Hz 和 90Hz 兩種刷新率。

60Hz 的屏幕每 16.6ms 刷新一次顯示內(nèi)容。這意味著圖像顯示的時(shí)間是 16.6ms 的倍數(shù) (16.6ms、33.3ms、50ms 等)。支持多種刷新率的屏幕則帶來(lái)了更多的選擇,這些屏幕能以不同的速度進(jìn)行渲染,并且不會(huì)出現(xiàn)抖動(dòng)。例如,一個(gè)無(wú)法維持 60fps 渲染的游戲,在 60Hz 的屏幕上必須一路降到 30fps 才能確保流暢無(wú)抖動(dòng) (因?yàn)轱@示器只能以 16.6ms 的倍數(shù)周期呈現(xiàn)圖像,所以 60Hz 的下一檔可用幀速是每 33.3ms 顯示一幀,即 30fps)。而在 90Hz 設(shè)備上,同樣的游戲只需要下降到 45fps (每幀 22.2ms) 即可,這就為用戶帶來(lái)了更流暢的體驗(yàn)。而同時(shí)支持 90Hz 和 120Hz 的設(shè)備,則可以用每秒 120、90、60 (120/2)、45 (90/2)、40 (120/3)、30 (90/3)、24 (120/5) 等幀率流暢地呈現(xiàn)內(nèi)容。

高頻率渲染

渲染頻率越高,就越難維持幀率,因?yàn)橹挥懈俚臅r(shí)間完成相同的工作量。要在 90Hz 下進(jìn)行渲染,應(yīng)用需要在 11.1ms 內(nèi)生成一幀,與此相比,在 60Hz 時(shí)則有 16.6ms 來(lái)生成一幀。

為了詳細(xì)說(shuō)明這一點(diǎn),我們來(lái)看看 Android UI 的渲染流水線。我們可以將幀渲染大致分為五個(gè)流水線階段:
① 應(yīng)用的 UI 線程處理輸入事件,調(diào)用應(yīng)用的回調(diào),并更新視圖 (View) 層次結(jié)構(gòu)中記錄的繪圖命令列表;
② 應(yīng)用的 RenderThread 將記錄的命令發(fā)送到 GPU
③ GPU 繪制這一幀;
④ SurfaceFlinger 是負(fù)責(zé)在屏幕上顯示不同應(yīng)用窗口的系統(tǒng)服務(wù),它會(huì)組合出屏幕應(yīng)該最終顯示出的內(nèi)容,并將畫面提交給屏幕的硬件抽象層 (HAL);
⑤ 屏幕最終呈現(xiàn)該幀的內(nèi)容。

整個(gè)流水線由 Android Choreographer 控制。Choreographer 基于顯示垂直同步 (vsync) 事件,它表示屏幕開始掃描出圖像并更新顯示像素的時(shí)間點(diǎn)。雖然 Choreographer 基于 vsync 事件,但對(duì)應(yīng)用和 SurfaceFlinger 來(lái)說(shuō),其喚醒偏移量不同。下圖展示了在 Pixel 4 設(shè)備上運(yùn)行的流水線,應(yīng)用在 vsync 事件后 2ms 被喚醒,SurfaceFlinger 則在 vsync 事件后 6ms 被喚醒。這樣一來(lái),應(yīng)用產(chǎn)生一幀畫面的時(shí)間為 20ms,SurfaceFlinger 組合畫面內(nèi)容的時(shí)間則為 10ms。


當(dāng)以 90Hz 頻率運(yùn)行時(shí),應(yīng)用依然在 vsync 事件后 2ms 被喚醒。然而,SurfaceFlinger 在 vsync 事件后 1ms 被喚醒,同樣有 10ms 的時(shí)間來(lái)合成屏幕內(nèi)容。但這樣一來(lái)應(yīng)用只有 10ms 來(lái)渲染一幀畫面,這時(shí)間就非常窘迫了:


為了緩解這種情況,Android 的 UI 子系統(tǒng)采用了預(yù)先渲染 (render ahead,指維持一幀的啟動(dòng)時(shí)間不變,但推遲其呈現(xiàn)時(shí)間) 來(lái)深化流水線,并將幀的呈現(xiàn)時(shí)間推遲一個(gè) vsync。這樣一來(lái),應(yīng)用可以有 21ms 的時(shí)間來(lái)生成一幀,同時(shí)確保維持 90Hz 的吞吐量。


一些應(yīng)用,包括大多數(shù)游戲,都有自己自定義的渲染流水線。這些流水線可能會(huì)有更多或更少的階段,具體取決于它們要完成的任務(wù)。一般來(lái)說(shuō),流水線越深,可以并行執(zhí)行的階段就越多,整體的吞吐量也會(huì)相應(yīng)增加。但另一方面,這樣可能會(huì)增加單幀的延遲 (延遲量為 number_of_pipeline_stages x longest_pipeline_stage)。這中間如何取舍需要開發(fā)者審慎考慮。

利用可變刷新率

如上所述,可變刷新率允許我們使用更多樣的渲染頻率。對(duì)于可以控制渲染速度的游戲,以及需要以特定速率呈現(xiàn)內(nèi)容的視頻播放器來(lái)說(shuō),這一點(diǎn)尤其有用。例如,要在 60Hz 的顯示器上播放 24fps 的視頻,我們需要使用 3:2 pulldown 算法,這就會(huì)產(chǎn)生抖動(dòng)。但是,如果設(shè)備的屏幕可以原生顯示 24fps 的內(nèi)容 (24/48/72/120Hz),就無(wú)需使用 pulldown 算法,自然也就不會(huì)出現(xiàn)抖動(dòng)了。

設(shè)備運(yùn)行時(shí)的刷新率是由 Android 平臺(tái)控制的。應(yīng)用和游戲可以通過(guò)多種方法影響刷新率 (下面會(huì)有解釋),但最終結(jié)果由平臺(tái)決定。尤其是當(dāng)屏幕上同時(shí)有多個(gè)應(yīng)用時(shí),這一點(diǎn)至關(guān)重要: 平臺(tái)需要滿足所有應(yīng)用的刷新率需求。24fps 視頻播放器就是一個(gè)很好的例子。24Hz 對(duì)于視頻播放來(lái)說(shuō)可能很好,但對(duì)于響應(yīng)式 UI 來(lái)說(shuō)就很糟糕了。如果一個(gè)推送通知的動(dòng)畫只有 24Hz,感覺(jué)就會(huì)很扎眼。在這種情況下,平臺(tái)會(huì)選擇讓屏幕上的內(nèi)容都顯示良好的刷新率。

為此,應(yīng)用可能需要知道當(dāng)前設(shè)備的刷新率??梢酝ㄟ^(guò)以下方法來(lái)實(shí)現(xiàn):

  • SDK
    通過(guò) DisplayManager.DisplayListener 注冊(cè)一個(gè)顯示監(jiān)聽器,并通過(guò) Display.getRefreshRate 查詢刷新率。
  • NDK
    使用 AChoreographer_registerRefreshRateCallback 注冊(cè)回調(diào) (API 級(jí)別30)。

應(yīng)用可以通過(guò)在其 Window 或 Surface 上設(shè)置幀率來(lái)影響設(shè)備刷新率。這是 Android 11 中引入的一個(gè)新功能,允許平臺(tái)了解應(yīng)用的渲染需求。應(yīng)用可以調(diào)用以下方法之一:

關(guān)于如何使用這些 API,請(qǐng)參考幀率指南文檔。

系統(tǒng)會(huì)根據(jù) Window 或 Surface 上設(shè)置的幀率選擇最合適的刷新率。

在較舊的 Android 版本 (Android 11 之前) 中并不存在 setFrameRate API,這時(shí)應(yīng)用仍然可以通過(guò)直接將 WindowManager.LayoutParams.preferredDisplayModeId 設(shè)置為 Display.getSupportedModes 中的可用模式之一來(lái)影響刷新率。從 Android 11 開始,我們不建議大家采用這種方法,因?yàn)槠脚_(tái)會(huì)不知道應(yīng)用的渲染意圖。例如,如果一個(gè)設(shè)備支持 48Hz、60Hz 和 120Hz,屏幕上有兩個(gè)應(yīng)用分別調(diào)用 setFrameRate(60, …) 和 setFrameRate(24, …),那么平臺(tái)可以選擇 120Hz 來(lái)同時(shí)滿足這兩個(gè)應(yīng)用。而如果這些應(yīng)用使用了 preferredDisplayModeId,它們很可能會(huì)把模式設(shè)置為 60Hz 和 48Hz,那這時(shí)平臺(tái)就無(wú)法使用 120Hz 了。這時(shí)平臺(tái)只能從 60Hz 或 48Hz 中選擇一個(gè),從而影響到另一個(gè)應(yīng)用的顯示效果。

總結(jié)

刷新率不一定是 60Hz——不要想當(dāng)然地認(rèn)為它一定會(huì)是 60Hz,也不要基于歷史經(jīng)驗(yàn)作出硬性假設(shè)。

刷新率并不總是恒定的——如果您想了解實(shí)際的刷新率,就需要注冊(cè)一個(gè)回調(diào)來(lái)知曉刷新率的變動(dòng),并相應(yīng)地更新您應(yīng)用內(nèi)部的數(shù)據(jù)。

如果您沒(méi)有使用 Android UI 工具包,而使用自定義的渲染器,請(qǐng)考慮根據(jù)當(dāng)前的刷新率來(lái)改變您的渲染流水線。通過(guò)使用 OpenGL 上的 eglPresentationTimeANDROID 或 Vulkan 上的 VkPresentationTimesInfoGOOGLE 設(shè)置一個(gè)呈現(xiàn)時(shí)間戳,即可深化流水線。設(shè)置呈現(xiàn)時(shí)間戳可以向 SurfaceFlinger 指示何時(shí)呈現(xiàn)圖像。如果設(shè)置為未來(lái)的幾幀,它就會(huì)按照設(shè)置的幀數(shù)加深流水線。前文例子中的 Android UI 將呈現(xiàn)時(shí)間設(shè)置成了 frameTimeNanos + 2 * vsyncPeriod。

注: frameTimeNanos 從 Choreographer 獲??;vsyncPeriod 從 Display.getRefreshRate() 獲取。

使用 setFrameRate API 告訴平臺(tái)您的渲染意圖,平臺(tái)會(huì)選擇合適的刷新率來(lái)匹配不同的需求。

您應(yīng)該只在必要時(shí)才使用 preferredDisplayModeId: 當(dāng) setFrameRate API 不可用時(shí),或是當(dāng)您需要使用非常特定的模式時(shí)。

最后,請(qǐng)您深入了解一下 Android 的幀同步庫(kù)。這個(gè)庫(kù)可以為您的游戲妥善處理幀同步,并使用前文中的方法來(lái)處理多種刷新率。

本文轉(zhuǎn)自: 谷歌開發(fā)者(Google_Developers,作者:Ady Abraham, Software Engineer,
轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。

Android 渲染
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1新一代網(wǎng)絡(luò)可視化(NPB 2.0)
  2. 3.40 MB  |  1次下載  |  免費(fèi)
  3. 2MDD品牌三極管MMBT3906數(shù)據(jù)手冊(cè)
  4. 2.33 MB  |  次下載  |  免費(fèi)
  5. 3MDD品牌三極管S9012數(shù)據(jù)手冊(cè)
  6. 2.62 MB  |  次下載  |  免費(fèi)
  7. 4聯(lián)想flex2-14D/15D說(shuō)明書
  8. 4.92 MB   |  次下載  |  免費(fèi)
  9. 5收音環(huán)繞擴(kuò)音機(jī) AVR-1507手冊(cè)
  10. 2.50 MB   |  次下載  |  免費(fèi)
  11. 624Pin Type-C連接器設(shè)計(jì)報(bào)告
  12. 1.06 MB   |  次下載  |  免費(fèi)
  13. 7MS1000TA 超聲波測(cè)量模擬前端芯片技術(shù)手冊(cè)
  14. 0.60 MB   |  次下載  |  免費(fèi)
  15. 8MS1022高精度時(shí)間測(cè)量(TDC)電路數(shù)據(jù)手冊(cè)
  16. 1.81 MB   |  次下載  |  免費(fèi)

本月

  1. 1愛(ài)華AIWA HS-J202維修手冊(cè)
  2. 3.34 MB   |  37次下載  |  免費(fèi)
  3. 2PC5502負(fù)載均流控制電路數(shù)據(jù)手冊(cè)
  4. 1.63 MB   |  23次下載  |  免費(fèi)
  5. 3NB-IoT芯片廠商的資料說(shuō)明
  6. 0.31 MB   |  22次下載  |  1 積分
  7. 4H110主板CPU PWM芯片ISL95858HRZ-T核心供電電路圖資料
  8. 0.63 MB   |  6次下載  |  1 積分
  9. 5UWB653Pro USB口測(cè)距通信定位模塊規(guī)格書
  10. 838.47 KB  |  5次下載  |  免費(fèi)
  11. 6技嘉H110主板IT8628E_BX IO電路圖資料
  12. 2.61 MB   |  4次下載  |  1 積分
  13. 7蘇泊爾DCL6907(即CHK-S007)單芯片電磁爐原理圖資料
  14. 0.04 MB   |  4次下載  |  1 積分
  15. 8100W準(zhǔn)諧振反激式恒流電源電路圖資料
  16. 0.09 MB   |  2次下載  |  1 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935137次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233089次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費(fèi)下載
  8. 340992  |  191439次下載  |  10 積分
  9. 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  10. 158M  |  183353次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81602次下載  |  10 積分
  13. 7Keil工具M(jìn)DK-Arm免費(fèi)下載
  14. 0.02 MB  |  73822次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65991次下載  |  10 積分
呈贡县| 铁岭市| 许昌市| 宜良县| 横峰县| 玉田县| 黄骅市| 宿迁市| 化州市| 比如县| 改则县| 澜沧| 瓮安县| 射洪县| 四川省| 武乡县| 新乡市| 乌审旗| 蓬安县| 五家渠市| 邢台县| 普兰店市| 沿河| 乐山市| 绥化市| 安康市| 石河子市| 东乌珠穆沁旗| 宁安市| 维西| 唐河县| 正镶白旗| 齐齐哈尔市| 岑溪市| 平远县| 中江县| 仁化县| 信丰县| 乡宁县| 宜州市| 高要市|