按需渲染如何改善移動(dòng)端性能上岗?

本文轉(zhuǎn)自Unity Connect

大多數(shù)時(shí)候,項(xiàng)目并不需要一直保持最高幀率渲染蕴坪,尤其是在移動(dòng)平臺(tái)上肴掷。過(guò)去敬锐,Unity開(kāi)發(fā)者們常使用Application targetFrameRate或Vsync(垂直同步)來(lái)限制引擎的渲染速度。這種方法在影響渲染的同時(shí)呆瞻,還會(huì)對(duì)其他部分的運(yùn)行速率造成一些影響台夺。而新的按需渲染API允許開(kāi)發(fā)者將渲染頻率從整體中獨(dú)立出來(lái)調(diào)整。

什么是按需渲染痴脾?按需渲染可以在降低渲染幀數(shù)的同時(shí)颤介,讓其他部分系統(tǒng)依舊以高頻率運(yùn)行。它在移動(dòng)端的用處最大赞赖。省去部分渲染可以大幅提升性能滚朵、降低能耗,同時(shí)應(yīng)用依舊可以對(duì)觸控事件作出及時(shí)響應(yīng)前域。

按需渲染的使用場(chǎng)景辕近?

在以下幾個(gè)情景中,降低幀率通常是更好的選擇:

菜單(即應(yīng)用入口或暫停菜單):菜單通常是一個(gè)較為簡(jiǎn)單的場(chǎng)景匿垄,不需要高頻率的渲染移宅。即使將菜單渲染速率降低,應(yīng)用依舊可以在未渲染的幀上接受到指令輸入椿疗。降低渲染速率后吞杭,我們就能降低能耗,通過(guò)限制CPU頻率來(lái)防止設(shè)備溫度過(guò)高变丧,UI互動(dòng)也能依舊平滑芽狗。

回合制游戲(如象棋):在回合制游戲中,玩家需要思考下一步行動(dòng)痒蓬,等待對(duì)手的行動(dòng)童擎。這段時(shí)間游戲內(nèi)的活動(dòng)較少,我們可以降低幀率來(lái)減少不必要的能耗攻晒、延長(zhǎng)電池壽命顾复。

靜態(tài)內(nèi)容:在應(yīng)用中,在大部分時(shí)間都處于靜態(tài)的內(nèi)容上鲁捏,比如車內(nèi)用戶界面芯砸,可以適當(dāng)?shù)亟档蛶省?/p>

性能控制:如果想要控制能耗和設(shè)備溫度,在延長(zhǎng)電池壽命的同時(shí)又不限制CPU性能给梅,尤其是使用了Adaptive Performance包的情況下假丧,可以通過(guò)調(diào)整渲染速率來(lái)實(shí)現(xiàn)目標(biāo)。

機(jī)器學(xué)習(xí)和AI:減少CPU在渲染上的工作量动羽,可以讓?xiě)?yīng)用的機(jī)器學(xué)習(xí)和AI處理有些許的性能提升包帚。

按需渲染支持哪些平臺(tái)?

所有平臺(tái)运吓!Unity 2019.3的按需渲染功能支持所有平臺(tái)(詳情請(qǐng)見(jiàn)系統(tǒng)要求部分)和渲染API(包括內(nèi)置渲染管線Built-in Render Pipeline渴邦、通用渲染管線URP和高清渲染管線HDRP)疯趟。

如何使用按需渲染呢?

按需渲染的API包含在UnityEngine.Rendering命名空間中谋梭,由三種屬性組成信峻。

OnDemandRendering.renderFrameInterval

該API是最重要的部分。我們可以用它來(lái)取得或設(shè)置渲染幀間隔瓮床,確定幀率盹舞。

渲染幀間隔是確定Application.targetFrameRate及QualitySettings.vSyncCount間隔的要素。

打個(gè)比方纤垂,我們將Application.targetFrameRate設(shè)置為60矾策,將OnDemandRendering.renderFrameInterval設(shè)置為2磷账,則系統(tǒng)會(huì)每隔一幀渲染一次峭沦,最終幀率便為30fps。

?OnDemandRendering.effectiveFrameRate

該屬性會(huì)給出應(yīng)用渲染幀率的估算值逃糟。

估算值根據(jù)OnDemandRendering.renderFrameInterval吼鱼、Application.targetFrameRate

和QualitySetting.vSyncCount的數(shù)值,以及顯示器刷新頻率計(jì)算得出绰咽。請(qǐng)注意這只是個(gè)估算值菇肃,并不一定是實(shí)際表現(xiàn);當(dāng)CPU同時(shí)在處理其他腳本取募、物理模擬琐谤、網(wǎng)絡(luò)傳輸?shù)鹊冗M(jìn)程時(shí),效率難免會(huì)降低玩敏,應(yīng)用的渲染速度也可能變慢斗忌。

?OnDemandRendering.willThisFrameRender

該API會(huì)告知當(dāng)前幀是否會(huì)被渲染到屏幕上。我們可以在不渲染的幀上執(zhí)行一些吃CPU性能的進(jìn)程旺聚,比如復(fù)雜的數(shù)學(xué)運(yùn)算织阳、加載資源或生成預(yù)制件。

注意事項(xiàng)

雖然幀的渲染速率降低了砰粹,但事件依舊會(huì)以平常的步調(diào)被傳入腳本唧躲,意味著在未渲染的幀上一樣會(huì)收到指令輸入。

為了防止輸入延遲的出現(xiàn)碱璃,我們建議在輸入指令時(shí)調(diào)用OnDemandRendering.renderFrameInterval = 1弄痹,讓按鈕、移動(dòng)動(dòng)作等能及時(shí)響應(yīng)嵌器。

未渲染幀上的腳本寫(xiě)入界酒、物理模擬、動(dòng)畫(huà)等繁重的進(jìn)程并不受益于按需渲染嘴秸,這使得CPU使用率會(huì)出現(xiàn)起伏毁欣,帶來(lái)些許CPU和能耗的改善庇谆。

示例

在下方例子中,菜單上使用了按需渲染將幀率限制在了20fps凭疮,直到有指令輸入饭耳。

using UnityEngine;

using UnityEngine.Rendering;

public class Menu : MonoBehaviour

{

? ? // Start is called before the first frame update

? ? void Start()

? ? {

? ? ? ? QualitySettings.vSyncCount = 0;

? ? ? ? Application.targetFrameRate = 60;

? ? // When the Menu starts, set the rendering to target 20fps

? ? ? ? OnDemandRendering.renderFrameInterval = 3;

? ? }

? ? // Update is called once per frame

? ? void Update()

? ? {

? ? ? ? if (Input.GetMouseButton(0) || (Input.touchCount > 0))

? ? ? ? {

? ? ? ? ? ? // If the mouse button or touch detected render at 60 FPS (every frame).

? ? ? ? ? ? OnDemandRendering.renderFrameInterval = 1;

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? // If there is no mouse and no touch input then we can go back to 20 FPS (every 3 frames).

? ? ? ? ? ? OnDemandRendering.renderFrameInterval = 3;

? ? ? ? }

? ? }

}

百講不如一練,在文章的最后向各位提供一個(gè)展示按需渲染不同使用情景的示例項(xiàng)目

原文鏈接:https://connect.unity.com/p/an-xu-xuan-ran-ru-he-gai-shan-yi-dong-duan-xing-neng?app=true

歡迎戳上方原文鏈接执解,下載Unity官方技術(shù)社區(qū)app寞肖,在線技術(shù)答疑,發(fā)現(xiàn)更多資源干貨衰腌!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末新蟆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子右蕊,更是在濱河造成了極大的恐慌琼稻,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饶囚,死亡現(xiàn)場(chǎng)離奇詭異帕翻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)萝风,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)嘀掸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人规惰,你說(shuō)我怎么就攤上這事睬塌。” “怎么了歇万?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵揩晴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我堕花,道長(zhǎng)文狱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任缘挽,我火速辦了婚禮瞄崇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壕曼。我一直安慰自己苏研,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布腮郊。 她就那樣靜靜地躺著摹蘑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轧飞。 梳的紋絲不亂的頭發(fā)上衅鹿,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天撒踪,我揣著相機(jī)與錄音,去河邊找鬼大渤。 笑死制妄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泵三。 我是一名探鬼主播耕捞,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼烫幕!你這毒婦竟也來(lái)了俺抽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤较曼,失蹤者是張志新(化名)和其女友劉穎磷斧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诗芜,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞳抓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年埃疫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伏恐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栓霜,死狀恐怖翠桦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胳蛮,我是刑警寧澤销凑,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站仅炊,受9級(jí)特大地震影響斗幼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抚垄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一蜕窿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呆馁,春花似錦桐经、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纺腊,卻和暖如春畔咧,著一層夾襖步出監(jiān)牢的瞬間茎芭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工誓沸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骗爆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓蔽介,卻偏偏與公主長(zhǎng)得像摘投,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虹蓄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容