本文轉(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)更多資源干貨衰腌!