日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常说的手机刷新率60Hz、120Hz有什么不同?

發(fā)布時間:2024/2/28 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常说的手机刷新率60Hz、120Hz有什么不同? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在很長一段時間里,手機(jī)的刷新率都是60Hz,隨著硬件設(shè)備性能的提升,各種高刷新率的移動設(shè)備層出不窮,移動端也能有120Hz的顯示設(shè)備。那么手機(jī)上的游戲真的是FPS越高越好嗎?本期我們就來探索這其中的真相。文章作者:侯鑫,騰訊游戲引擎研發(fā)工程師。

背景

作為手機(jī)游戲開發(fā)者,我們的工作中有很多時間都在嘗試優(yōu)化自己的代碼。比如讓某一段邏輯執(zhí)行的更快速,或降低一些迭代的頻率,減輕CPU負(fù)擔(dān),抑或通過各種騷操作在不降低畫面質(zhì)量的情況下,減輕GPU負(fù)擔(dān)

最終的目的都是想讓使用不同性能設(shè)備的玩家都可以流暢的體驗游戲。“卡不卡”也是玩家對游戲產(chǎn)生的第一印象之一,因此,我們的目的就是讓游戲以最快的速度運(yùn)行。

通常,評價一款游戲是否流暢的最直觀的指標(biāo)就是FPS(幀/秒)。那么,FPS真的是越高越好嗎?

市面上評測硬件性能都是對比不同硬件下相同畫質(zhì)游戲的FPS,且越高越好(Higher is better)。

對于桌面平臺來講,它有持續(xù)穩(wěn)定的供電與強(qiáng)勁的散熱方案,不需要考慮發(fā)熱與耗電量的問題,可以讓硬件自由發(fā)揮。其次我們還要考慮顯示設(shè)備(手機(jī)屏幕、電腦屏幕)的刷新率(RefreshRate)。

為了了解幀率(單位是FPS)與刷新率的關(guān)系,我們先來看看他們的定義:


1. 幀率(FrameRate)

幀率是GPU和CPU合作在游戲運(yùn)行時,可產(chǎn)生的圖像的數(shù)量,計量單位是幀/秒(FramePerSecond),通常是評估硬件性能與游戲體驗流暢度的指標(biāo)。


2. 刷新率(RefreshRate)

刷新率(垂直刷新率、垂直掃描率)表示顯示設(shè)備一秒內(nèi)可顯示的新圖像的數(shù)量,計量單位是赫茲(Hz)。


刷新率與幀率是兩個獨(dú)立的概念,幀率表示驅(qū)動顯示器的設(shè)備每秒可產(chǎn)生新圖像的數(shù)量。

可簡單理解為:

  • 游戲引擎與驅(qū)動是生產(chǎn)者,工作效率用幀率來評價;

  • 顯示設(shè)備是消費(fèi)者,工作效率用刷新率來評價。

簡而言之,我們真正感受到的流暢度會被刷新率限制,當(dāng)幀率高過刷新率時,顯示器每秒所能顯示的圖像數(shù)量仍然是不變的。

3. 畫面撕裂(ScreenTearing)

假設(shè)你的顯示設(shè)備刷新率為60Hz,當(dāng)幀率高過刷新率或游戲運(yùn)行時的幀時間不是1/60的倍數(shù)(2/60、3/60),即其FPS不是:…/120/60/30/20/… 時,就會存在顯示器正在刷新圖像的同時,新的數(shù)據(jù)也正由顯卡傳過來的情況,導(dǎo)致屏幕中有多幀數(shù)據(jù)同時出現(xiàn)的情況。

如上圖所示,B幀渲染較快,在A幀的數(shù)據(jù)仍在顯示器中刷新時,提交了新數(shù)據(jù),造成畫面撕裂,這種現(xiàn)象就叫做畫面撕裂。這種瑕疵最簡單的解決方案是垂直同步(VSync)。

4. 垂直同步(Vertical Synchronization)

垂直同步會同步顯卡與顯示設(shè)備的工作:

當(dāng)顯示器在刷新數(shù)據(jù)時,會讓GPU等待,直到完全刷新數(shù)據(jù)后,讓GPU提交新的數(shù)據(jù),并在下一個刷新周期刷新。

垂直同步會將游戲的FPS限制為顯示設(shè)備的刷新率,其最大的問題是會導(dǎo)致玩家輸入延遲,因為它會要求顯卡在渲染完畢后等待顯示設(shè)備去刷新數(shù)據(jù)。

顯而易見,這個問題對于競技游戲的影響是很大的。


(1)NVIDIA G-Sync

如果你是NVIDIA顯卡,且你的顯卡和顯示器均支持G-Sync[1],則顯示器中的特殊芯片會與顯卡進(jìn)行交流,使顯示器調(diào)整其刷新率以匹配顯卡的幀率。

其缺點是需要硬件(顯示設(shè)備硬件)支持。


(2)AMD FreeSync

FreeSync[2]是基于DP接口(DisplayPort)所支持的自動同步技術(shù)[3](Adaptive-Sync)實現(xiàn)的。

這是一個開放的技術(shù)標(biāo)準(zhǔn),因此FreeSync不需要授權(quán)費(fèi)用,通常支持FreeSync的顯示設(shè)備會比G-Sync便宜。

了解到影響用戶體驗的這些因素后,我們也了解到相應(yīng)的解決方案。那么,移動平臺的具體情況是什么?與桌面平臺又有什么不同呢?

移動平臺

以高通為例,其Adreno[4] GPU的性能數(shù)據(jù)如下表所示:

高通驍龍865所配置的Adreno 650與Intel 11代CPU所附帶的Iris Plus集顯對比:

可以看到目前的旗艦移動GPU的浮點數(shù)算力已經(jīng)趕超Intel的集顯,性能已經(jīng)非常可觀,移動端硬件也有能力去輸出非常高的幀率。


1. Android

移動平臺的顯示設(shè)備在很長一段時間里,都是60Hz。

我們從上文了解到,在游戲圖像展示在顯示屏的過程中,有一個比較影響用戶體驗的同步過程。


游戲邏輯和渲染循環(huán)與安卓系統(tǒng)和顯示屏硬件之間有一個同步的關(guān)系,這個同步過程我們稱為幀節(jié)奏(Frame Pacing),也即引擎與CPU、GPU配合產(chǎn)生圖像的幀率 與顯示屏刷新率之間的同步關(guān)系。

安卓的顯示系統(tǒng)可避免畫面撕裂(ScreenTearing)的問題,即當(dāng)顯示器正在刷新數(shù)據(jù)時,新的數(shù)據(jù)被Push到顯示設(shè)備時的情況。其通過以下措施避免撕裂(Tearing):

  • 將歷史幀數(shù)據(jù)緩存住;

  • 自動檢測有延遲的幀數(shù)據(jù)提交;

  • 當(dāng)提交有延遲時,重復(fù)渲染歷史幀數(shù)據(jù)。

通過Buffer緩存幀數(shù)據(jù),當(dāng)顯示器刷新時,如果有新數(shù)據(jù)傳輸,直接將其緩存即可。如此設(shè)計,就不會有VSYNC的阻塞式等待的問題,也不會增大影響游戲邏輯的輸入延遲。

雖然帶來了一定的畫面延遲,但可以避免畫面撕裂問題。具體的數(shù)據(jù)提交流程如下:

首先引擎通過 eglSwapBuffers 告知顯示系統(tǒng) SurfaceFlinger[5],其次SurfaceFlinger 會將數(shù)據(jù)緩存到Buffer中。

如果當(dāng)前是刷新的窗口期,SF會等待硬件的VSYNC信號。收到信號后,SF將從Buffer中找到最新的Buffer;如果沒有找到,就用上一次的Buffer;如果正在刷新中,SF則是處在睡眠狀態(tài)(設(shè)備實現(xiàn)相關(guān))。

假設(shè)同步(Frame Pacing)頻率為30Hz時,正確的同步關(guān)系如下圖:

NB即為No Buffer,Latch即表示為Buffer傳輸中。圖中的Display刷新率為60Hz,渲染的頻率為30Hz。

(1)短幀卡頓

當(dāng)某幀的渲染時間變小,會出現(xiàn)卡頓現(xiàn)象(Stuttering):

如上圖所示,C幀的渲染因為一些原因所花費(fèi)的時間很短,在下一個刷新窗口期就渲染完畢了,因此曾經(jīng)的NB位置存儲了C幀的圖像數(shù)據(jù),最終導(dǎo)致刷新出的幀序列變?yōu)?#xff1a;AABCCC,C幀的FrameTime短了,反而讓玩家感受到游戲不流暢了。

(2)解決短幀卡頓

安卓提供了Swappy Frame Pacing庫(Android Game SDK[6]的一部分),UE4.25[7]與Unity2019.2[8]已合入Swappy庫。

通過 EGL_ANDROID_presentation_time[9]設(shè)置顯示器Present的時間。在我們的例子中,更新頻率是30Hz,通過設(shè)置PresentTime為30Hz,即可避免短幀卡頓的情況。

(3)長幀卡頓/延遲

如上圖,B幀因為一些原因占用了超過33.3ms的幀時間,導(dǎo)致NB的幀重復(fù)了兩次,造成AAABCC的幀序列,從而導(dǎo)致卡頓:

  • A延續(xù)了三幀;

  • B只展示了一幀。


(4)解決長幀卡頓

Swappy會通過添加同步鎖,使顯示系統(tǒng)有充足的等待空間,從而不至于將影響擴(kuò)散。

通過同步鎖 EGL_KHR_fence_sync[10] ,雖然幀A的問題無法解決,但幀A之后的B、C都不會受到幀A的影響。

2. Frame Pacing Library

Android Game SDK 中的 Swappy 庫,不僅可以解決長短幀的問題,也可以支持動態(tài)調(diào)整設(shè)備的刷新率,以提供給玩家最流暢的視覺體驗。不同刷新率的設(shè)備支持不同的FPS:

  • 60Hz:60FPS/30FPS/20FPS

  • 60 + 90Hz:90FPS/60FPS/45FPS/30FPS

  • 60 + 90 + 120Hz:120FPS/90FPS/60FPS/45FPS/40FPS/30FPS

Swappy可根據(jù)渲染器的具體幀時間,選擇最符合的刷新率,提供給玩家一個更流暢的視覺體驗,通過systrace[11]可根據(jù)SurfaceView的數(shù)據(jù)驗證Frame Pacing庫的改進(jìn)。

至此我們了解到安卓平臺的Frame Pacing改進(jìn)方案Swappy庫,其實就是一個簡化版的G-Sync或Free-Sync,都可以通過動態(tài)調(diào)整顯示器的刷新率(支持動態(tài)刷新率的設(shè)備)來輸出更流暢的效果


3. iOS

蘋果在2018年的WWDC上分享過一個演講[12],其中介紹了蘋果在Frame Pacing上所做的改進(jìn)。

上面的動圖中雖然左側(cè)是40FPS,高于右側(cè)的30FPS,但用戶體驗明顯是30FPS側(cè)更友好。

40FPS的執(zhí)行時序情況如上圖所示,VSYNC的最小間隔即刷新率為60Hz。當(dāng)我們以盡可能快的速度去渲染新的幀時,0/1刷新點Display的緩存中沒有數(shù)據(jù),因此均使用歷史數(shù)據(jù)。

即A展示了2幀。第2幀時,B幀的GPU計算完畢,可直接展示B。第3幀時,C幀的GPU計算完畢,直接展示C,且因為A的GPU錯過了刷新點4,因此C也展示了兩幀。依次循環(huán)往復(fù),造成了:AABCCABBCAA 的長短幀問題,最終導(dǎo)致卡頓的表現(xiàn)。

(1)設(shè)置固定幀率

iOS 10.3以上支持新的API:

MTLDrawable addPresentedHandlerMTLCommandBuffer presentDrawable afterMinimumDurationMTLCommandBuffer presentDrawable atTime

可設(shè)置最小幀間隔,從而解決長短幀的問題:

// Render Scene...// Get drawable and present at 30 FPSlet drawable = view.currentDrawable { // Render Final Pass ... let duration = 33.0 / 1000.0 // Duration of 33 ms commandBuffer.present(drawable, afterMinimumDuration: duration)}commandBuffer.commit()

通過設(shè)置幀渲染最小間隔,可讓幀以固定的頻率渲染新的幀,從而為CPU、GPU留下了足夠長的時間去渲染場景。


假設(shè)刷新率為60Hz,只要CPU與GPU完成協(xié)作輸出數(shù)據(jù)的時間在3*(1/60)ms之內(nèi),即第1幀GPU的工作C 保證在 第3幀的工作A開啟之前完成,iOS設(shè)備就可以輸出連續(xù)的30Hz的圖像。

4. Unreal Engine 4

從4.25版本開始,UE4整合了安卓的Swappy庫:

// Runtime/OpenGLDrv/Private/Android/AndroidOpenGLFramePacer.cppvoid FAndroidOpenGLFramePacer::Init() { InitSwappy();}void FAndroidOpenGLFramePacer::InitSwappy() { JNIEnv* Env = FAndroidApplication::GetJavaEnv(); SwappyGL_init(Env, FJavaWrapper::GameActivityThis);}

開啟Swappy時直接使用其API對Frame Pacing進(jìn)行控制:

// r.setframepace 30// a.UseSwappyForFramePacing=1bool FAndroidOpenGLFramePacer::SwapBuffers(bool bLockToVsync) {#if USE_ANDROID_OPENGL_SWAPPY int64 DesiredFrameNS = (1000000000L) / (int64)FAndroidPlatformRHIFramePacer::GetFramePace(); SwappyGL_setSwapIntervalNS(DesiredFrameNS); SwappyGL_setAutoSwapInterval(false); SwappyGL_swap(eglDisplay, eglSurface);#endif

根據(jù)UE4的代碼,UE4并未使用Swappy的默認(rèn)模式[13],而是根據(jù)配置,通過Swappy設(shè)置了正確的同步節(jié)奏。


Swappy比UE4默認(rèn)的FramePacer更了解安卓系統(tǒng)。根據(jù)UE4的文檔,其真實表現(xiàn)也比默認(rèn)的Pacer更穩(wěn)定,未來的版本也將會在安卓平臺把Swappy作為默認(rèn)的FramePacer。

4.25以下版本使用UE4的Leagcy Frame Pacer:通過eglSwapInterval[14]控制Swap Buffer時所需等待的VBLANK[15]次數(shù)。

VBLANK指一幀數(shù)據(jù)最后一行顯示完畢到下一幀第一行數(shù)據(jù)開始顯示的過程,eglSwapInterval 實際上是無法精確了解顯示屏(硬件)刷新的時間的,因此其真實效果不如更了解硬件的Swappy好。

// rhi.SyncInterval, 60Hz設(shè)置為1int32 SyncInterval = GetLegacySyncInterval();// 當(dāng)配置的同步間隔改變時,使用eglSwapInterval配置VBLANK等待次數(shù)if (DesiredSyncIntervalRelativeTo60Hz != SyncInterval) { eglSwapInterval(eglDisplay, DriverSyncIntervalRelativeToDevice);}

若設(shè)備支持?ANDROID_get_frame_timestamps[16]?擴(kuò)展,可通過API拿到驅(qū)動層的一些時間數(shù)據(jù),計算出更精確的SwapInterval:

EGLint Item = EGL_COMPOSITE_INTERVAL_ANDROID;// The time delta between subsequent composition events.eglGetCompositorTimingANDROID_p(eglDisplay, eglSurface, 1, &Item, &COMPOSITE_INTERVAL);if (COMPOSITE_INTERVAL >= 4000000 && COMPOSITE_INTERVAL <= 41666666) { DriverRefreshRate = float(1000000000.0 / double(COMPOSITE_INTERVAL)); DriverRefreshNanos = COMPOSITE_INTERVAL;}

并且可以解決短幀卡頓的問題。即通過查詢歷史幀的數(shù)據(jù),控制Compositor的工作時機(jī),當(dāng)短幀發(fā)生時,根據(jù)刷新率計算出正確的工作時間。

保證短幀的數(shù)據(jù)B在顯示器刷新兩次,以保持體驗的流暢性:

EGLint TimestampList = EGL_FIRST_COMPOSITION_START_TIME_ANDROID;// The first time at which// the compositor began preparing composition for this frame.EGLnsecsANDROID Result = 0;eglGetFrameTimestampsANDROID_p(eglDisplay, eglSurface, FrameIDs[Index % NUM_FRAMES_TO_MONITOR], 1, &TimestampList, &Result);// 設(shè)置下一幀的起始時間EGLnsecsANDROID DeltaNanos = EGLnsecsANDROID(DesiredSyncIntervalRelativeToDevice) * EGLnsecsANDROID(DeltaFrameIndex) * DriverRefreshNanos;EGLnsecsANDROID PresentationTime = Result + DeltaNanos;eglPresentationTimeANDROID_p(eglDisplay, eglSurface, PresentationTime);


(1)iOS

iOS通過控制CADisplayLink[17]的參數(shù)來控制FramePacing的表現(xiàn):

FIOSPlatformRHIFramePacer::FrameInterval = NewFrameInterval;uint32 MaxRefreshRate = FIOSPlatformRHIFramePacer::GetMaxRefreshRate();CADisplayLink* displayLinkParam = (CADisplayLink*)param;// iOS 10displayLinkParam.preferredFramesPerSecond = MaxRefreshRate / FIOSPlatformRHIFramePacer::FrameInterval;// pre iOS 10displayLinkParam.frameInterval = FIOSPlatformRHIFramePacer::FrameInterval;

即可通過歷史幀的數(shù)據(jù)動態(tài)調(diào)整FrameInterval或期望FPS,以達(dá)到更流暢的視覺體驗。


5. Unity

Unity2019.2之后在安卓平臺整合了Swappy作為FramePacer。

Unity2018版本僅設(shè)置了glSwapInterval,即通過不是很精確的timestamp模式控制FramePacing:

// Runtime/GfxDevice/egl/WindowContextEGL.cppEGLint WindowContextEGL::SetVSyncInterval(EGLint interval) { interval = clamp(interval, m_VSyncIntervalMin, m_VSyncIntervalMax); if (eglSwapInterval(m_EGLDisplay, interval)) return interval; return -1;}

而iOS上FramePacing的實現(xiàn)與UE4基本一致。

參考文獻(xiàn):

[1] G-Sync:

https://www.nvidia.com/en-us/geforce/products/g-sync-monitors/

[2] FreeSync:

https://www.amd.com/en/technologies/free-sync

[3] 自動同步技術(shù):

https://vesa.org/featured-articles/vesa-adds-adaptive-sync-to-popular-displayport-video-standard/

[4] Adreno :

https://en.wikipedia.org/wiki/Adreno

[5] ?SurfaceFlinger:

https://source.android.com/devices/graphics/surfaceflinger-windowmanager

[6] Android Game SDK:

https://developer.android.com/games/sdk

[7] UE4.25:

https://docs.unrealengine.com/en-US/Platforms/Mobile/Rendering/MobileFramePacing/index.html

[8] Unity2019.2:

https://unity3d.com/unity/alpha/2019.2.0a6

[9] EGL_ANDROID_presentation_time:

https://www.khronos.org/registry/EGL/extensions/ANDROID/EGL_ANDROID_presentation_time.txt

[10] ?EGL_KHR_fence_sync:

https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_fence_sync.txt

[11] systrace:

https://developer.android.com/games/sdk/frame-pacing/opengl/verify-improvement

[12] WWDC演講:

https://developer.apple.com/videos/play/wwdc2018/612/

[13] Swappy默認(rèn)模式:

https://developer.android.com/games/sdk/frame-pacing#supported_operating_modes

[14] SwapInterval:

https://www.khronos.org/opengl/wiki/Swap_Interval

[15] VBLANK:

https://en.wikipedia.org/wiki/Vertical_blanking_interval

[16] ?ANDROID_get_frame_timestamps :

https://www.khronos.org/registry/EGL/extensions/ANDROID/EGL_ANDROID_get_frame_timestamps.txt

[17] CADisplayLink:

https://developer.apple.com/documentation/quartzcore/cadisplaylink

總結(jié)

以上是生活随笔為你收集整理的常说的手机刷新率60Hz、120Hz有什么不同?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久久久91 | 国产精品一区二区久久毛片 | av五月天在线 | 亚洲日本中文字幕在线 | 成人网在线免费观看 | 欧美一区二区三区小说 | av资源在线免费观看 | 九九热免费 | 四虎网站在线播放 | 亚洲成人二区 | 久久国产精品系列 | 国产模特av私拍大尺度 | 无码av免费毛片一区二区 | 99综合久久| 国产免费脚交足视频在线观看 | 乖女从小调教h尿便器小说 欧美韩一区二区 | 久久e热 | 美女黄18以下禁止观看 | 中文字幕一区在线播放 | 国产女女做受ⅹxx高潮 | 久久6精品 | 玖玖玖国产精品 | 四虎久久久 | 国产一二区在线 | 国产一区二区三区在线免费观看 | 男人的天堂a在线 | 亚洲国产综合视频 | 97公开视频| 免费观看黄色网页 | 国产区一区二区三区 | 十大污视频 | 中字幕视频在线永久在线观看免费 | 天天射日日操 | 国产嘿咻视频 | 日批免费在线观看 | 国产精品丝袜一区 | 日韩欧美黄色网址 | 久久毛片 | 少妇人妻偷人精品一区二区 | 午夜视频久久 | 性做久久 | 1024香蕉视频 | 国产精品二区在线观看 | 亚洲乱亚洲乱妇 | 欧美一区二区三区黄片 | 欧美久操| 少妇高潮久久久 | 99视屏| 饥渴少妇色诱水电工 | 成人高清视频免费观看 | 51成人做爰www免费看网站 | 中文字幕在线观看视频免费 | 亚洲а∨天堂久久精品2021 | 黄色日韩| 国产精品白虎 | 日日摸天天爽天天爽视频 | 国产剧情在线一区 | 国产字幕侵犯亲女 | 激情视频一区二区三区 | 伊人365| 中文字幕人成 | 60分钟| 午夜影院色 | 男女无遮挡免费视频 | www.haoav| 天天看毛片 | 超碰在线人人 | 超碰97国产 | 国产高清精品软件丝瓜软件 | 国产美女菊爆在线播放APP | 色av一区 | 色婷婷狠狠干 | 日韩精品人妻一区二区三区免费 | 污视频网站免费看 | 在线观看高清视频 | 欧美性天堂 | 另类二区 | 午夜精品久久久久久久96蜜桃 | 五月天青青草 | 色七七桃花综合影院 | 久久婷婷综合色 | 欧美成人不卡视频 | 天堂中文在线8 | 在线成人 | 亚洲精品你懂的 | 免费成人深夜夜行p站 | 爱爱91 | 久久大片| 日本a区 | 亚洲a网站 | 日本韩国在线观看 | 久久一区二区三区精品 | 免费裸体视频女性 | 亚洲免费一二三区 | 国产在线看片 | 日本美女毛茸茸 | 国产三级日本三级在线播放 | 亚洲欧美综合另类自拍 | 69视频一区二区 |