![]()
這是第452篇UWA技術(shù)知識分享的推送,精選了UWA社區(qū)、UWA AI問答的熱門話題等技術(shù)知識點(diǎn),助力大家更全面地掌握和學(xué)習(xí)。
UWA社區(qū)主頁:community.uwa4d.com
UWA QQ群:793972859
本期目錄:
為何iPad Pro上設(shè)置目標(biāo)幀率為90時無法生效
- 為什么在Dedicated Server發(fā)布的程序中內(nèi)存數(shù)值異常
From問答社區(qū)
Q1:為什么iPad Pro上設(shè)置目標(biāo)幀率為90時無法生效,仍然以120幀運(yùn)行?
在使用Application.targetFrameRate設(shè)置目標(biāo)幀率為90時,在iPad Pro M2芯片上無法生效,目標(biāo)幀率變?yōu)?20,在iPhone 14 Pro上測試則能夠以80的幀率運(yùn)行。
在和平精英上用PerfDog采集,可以設(shè)置為90的選項(xiàng),實(shí)際以80的幀率在跑,但在Demo中測試無法達(dá)到同樣的效果。
A: 使用UWA AI問答的功能嘗試解讀這個問題。
分享鏈接:
https://www.uwa4d.com/main/uwa-shared.html?shareId=f3ea7cc1-879f-4f94-aeb5-b29860099ae2
該問題通常由垂直同步(VSync)與幀率控制機(jī)制的交互導(dǎo)致,尤其是在高刷新率設(shè)備如iPad Pro上。
核心原因分析
在Unity引擎中,Application.targetFrameRate是控制移動平臺幀率的主要方式。然而,當(dāng)垂直同步(VSync)開啟時,它會優(yōu)先于targetFrameRate生效。系統(tǒng)會強(qiáng)制將應(yīng)用的幀率鎖定到屏幕刷新率的整數(shù)分之一(如120Hz、60Hz、40Hz等),以避免畫面撕裂。因此,即使設(shè)置了targetFrameRate=90,系統(tǒng)也無法穩(wěn)定輸出非刷新率整除的幀率(90不是120的整除因子),最終會退回到設(shè)備支持的最高幀率(120fps)或下一個可行的分頻值。
此外,部分iOS設(shè)備(尤其是支持ProMotion技術(shù)的iPad Pro)具有動態(tài)刷新率調(diào)節(jié)能力,其底層圖形驅(qū)動可能進(jìn)一步影響幀率鎖定行為,使得targetFrameRate的控制不夠精確。
解決方案
1. 關(guān)閉VSync并依賴 targetFrameRate
確保在項(xiàng)目設(shè)置或運(yùn)行時關(guān)閉垂直同步:
QualitySettings.vSyncCount = 0; // 關(guān)閉VSync
Application.targetFrameRate = 90; // 設(shè)置目標(biāo)幀率為90這是實(shí)現(xiàn)非標(biāo)準(zhǔn)幀率(如90fps)最直接的方法。關(guān)閉VSync后,targetFrameRate將正常生效。
2. 使用引擎級幀平滑(Frame Pacing)
在使用虛幻引擎時,可通過CVar精確控制幀率。對于目標(biāo)幀率90,在配置文件中設(shè)置:
r.setframepace 90此方法直接對接設(shè)備刷新周期,能更可靠地在支持的設(shè)備上實(shí)現(xiàn)90fps。
3. 驗(yàn)證設(shè)備與系統(tǒng)支持
確認(rèn)當(dāng)前iPad Pro型號及iOS系統(tǒng)版本是否完整支持90Hz的輸出模式。某些情況下,操作系統(tǒng)或驅(qū)動可能限制了非標(biāo)準(zhǔn)刷新率的使用。
4. 監(jiān)控實(shí)際幀率
使用UWA GOT Online報告中的“FPS均值”和“>40ms幀數(shù)占比”指標(biāo),結(jié)合真機(jī)性能測試,驗(yàn)證幀率是否真正穩(wěn)定在90fps,并評估GPU負(fù)載與功耗表現(xiàn)。
綜上,欲在iPad Pro上穩(wěn)定運(yùn)行90fps,關(guān)鍵在于關(guān)閉VSync并通過Application.targetFrameRate明確指定目標(biāo)幀率,同時確保引擎和設(shè)備層面的支持。
Q2:如果已經(jīng)關(guān)閉垂直同步,還可能是什么原因?
A:即使已關(guān)閉垂直同步(VSync),在iPad Pro上設(shè)置Application.targetFrameRate = 90仍可能無法生效,原因如下:
1. 動態(tài)刷新率機(jī)制(ProMotion)的底層限制
iPad Pro搭載的ProMotion技術(shù)允許屏幕刷新率在120Hz、60Hz、40Hz、30Hz等特定檔位間動態(tài)切換。系統(tǒng)傾向于選擇最接近目標(biāo)幀率的標(biāo)準(zhǔn)分頻值。由于90不是120的整除因子,系統(tǒng)可能無法為90fps創(chuàng)建穩(wěn)定的刷新周期,最終退回到默認(rèn)的120Hz模式。
2. Unity引擎的幀時間計(jì)算與平臺適配問題
根據(jù)Unity文檔,移動平臺上的targetFrameRate實(shí)際效果受限于屏幕刷新率的整數(shù)分頻。即使VSync關(guān)閉,Unity的幀調(diào)度器仍可能因無法精確匹配90Hz的間隔而出現(xiàn)抖動或回落至120Hz。此外,若未將targetFrameRate設(shè)置為屏幕刷新率的約數(shù)(如120 → 60, 40, 30),系統(tǒng)可能忽略該設(shè)置。
3. 后臺進(jìn)程或系統(tǒng)策略干預(yù)
iOS系統(tǒng)可能會因性能管理、溫控或后臺任務(wù)(如應(yīng)用更新、索引服務(wù))臨時提升設(shè)備性能至最大刷新率,導(dǎo)致短暫脫離目標(biāo)幀率。
解決方案
方法一:使用有效的刷新率分頻值
避免設(shè)置非標(biāo)準(zhǔn)幀率,改用系統(tǒng)支持的分頻:
若需高幀率,直接設(shè)為 120
若目標(biāo)為平衡性能與功耗,建議設(shè)為 60 或 40
// 推薦做法
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 60; // 穩(wěn)定且兼容性最佳方法二:通過Metal API或原生插件控制(高級)
利用iOS Metal框架的CADisplayLink精確控制渲染周期,繞過Unity默認(rèn)調(diào)度,實(shí)現(xiàn)對90Hz的支持。此方法需編寫原生代碼,并確保設(shè)備支持。
方法三:驗(yàn)證并優(yōu)化項(xiàng)目配置
檢查項(xiàng)目是否啟用了“Adaptive Frame Rate”等動態(tài)調(diào)節(jié)功能。
在UWA GOT Online報告中查看“FPS均值”和“>40ms幀數(shù)占比”,確認(rèn)是持續(xù)120fps還是幀率波動。
使用UWA PA真機(jī)測試,排除模擬器或開發(fā)環(huán)境干擾。
綜上,根本原因在于iOS硬件刷新率策略與Unity幀控制機(jī)制的不匹配。最穩(wěn)妥方案是采用系統(tǒng)原生支持的幀率檔位(如60fps),以確保穩(wěn)定性與兼容性。
A2:iOS設(shè)備只能設(shè)置30的整數(shù)倍。
感謝123-619849@UWA問答社區(qū)提供了回答
歡迎大家轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/6909d30d682c7e5cd61bfb64
From問答社區(qū)
Q:在Dedicated Server發(fā)布的程序中,為什么在同一時刻Profiler.GetTotalReservedMemoryLong接口獲得的數(shù)值會比Profiler.GetMonoHeapSizeLong接口獲得的數(shù)值還小?
GetTotalReservedMemoryLong不是代表整個程序當(dāng)前申請的內(nèi)存大小嗎?
如上圖:
curValue - maxValue
totalMemory:Profiler.GetTotalAllocatedMemoryLong()
reservedMemory:Profiler.GetTotalReservedMemoryLong()
monoHeap:Profiler.GetMonoHeapSizeLong()
monoUse:Profiler.GetMonoUsedSizeLong()
引擎版本是2021.3.25f1c1。
A: 使用UWA AI問答的功能嘗試解讀這個問題。
分享鏈接:
https://www.uwa4d.com/main/uwa-shared.html?shareId=095aef95-daab-422c-ab95-acf6434f7892
在Dedicated Server(專用服務(wù)器)構(gòu)建的程序中,觀察到Profiler.GetTotalReservedMemoryLong()的值小于Profiler.GetMonoHeapSizeLong(),這看似矛盾,實(shí)則源于Unity內(nèi)存管理機(jī)制和Profiler接口統(tǒng)計(jì)范圍的本質(zhì)區(qū)別。
核心原因:GetTotalReservedMemoryLong在非開發(fā)版中不可靠
最關(guān)鍵的一點(diǎn)是:Profiler.GetTotalReservedMemoryLong()等多數(shù)Profiler API在非Development Build(即Release或Server Build)中返回的是不完整或不可靠的數(shù)據(jù)。雖然文檔指出部分內(nèi)存API在Release版可用,但GetTotalReservedMemoryLong的行為在Dedicated Server環(huán)境下可能受限或未被正確維護(hù)。
相反,GetMonoHeapSizeLong和GetMonoUsedSizeLong是少數(shù)明確說明“即使在Release構(gòu)建中也可用”的API,其數(shù)據(jù)相對可靠。
因此,你所觀測到的reservedMemory (238MB)小于monoHeap (255-284MB)很可能是因?yàn)镚etTotalReservedMemoryLong()返回的并非真實(shí)的總預(yù)留內(nèi)存,而是一個被截?cái)唷⑽锤禄騼H包含部分內(nèi)存池的值。
正確理解各指標(biāo)含義:
![]()
為何monoHeap可能大于reservedMemory?
1.reservedMemory數(shù)據(jù)失真:如前所述,在Dedicated Server下,GetTotalReservedMemoryLong可能沒有跟蹤所有內(nèi)存域(如圖形、音頻等子系統(tǒng)),或者其計(jì)數(shù)器未被激活,導(dǎo)致返回值偏低。
2.monoHeap是獨(dú)立增長的:托管堆會根據(jù)內(nèi)存壓力動態(tài)擴(kuò)容。當(dāng)托管內(nèi)存需求增加時,GC會請求更大的堆空間,GetMonoHeapSizeLong()隨之增大。如果此時GetTotalReservedMemoryLong()因?yàn)镻rofiler限制未能同步更新,則會出現(xiàn)monoHeap > reservedMemory的現(xiàn)象。
3.專用服務(wù)器的優(yōu)化配置:Dedicated Server通常禁用圖形驅(qū)動、音頻等模塊,這些模塊的內(nèi)存池可能未被計(jì)入GetTotalReservedMemoryLong,但托管堆仍可正常增長。
建議的排查與監(jiān)控方案
1. 避免依賴GetTotalReservedMemoryLong進(jìn)行關(guān)鍵判斷
在Release或Server Build中,該值不可信。
2. 使用更可靠的替代方案監(jiān)控總內(nèi)存
若目標(biāo)平臺支持,通過操作系統(tǒng)API(如Linux的/proc/self/status)讀取RSS或PSS。
使用SystemInfo.systemMemorySize結(jié)合應(yīng)用自身邏輯估算。
3. 重點(diǎn)關(guān)注托管內(nèi)存趨勢
定期調(diào)用GC.Collect()后獲取GetMonoUsedSizeLong(),監(jiān)控是否存在內(nèi)存泄漏。
觀察GetMonoHeapSizeLong()是否持續(xù)增長,判斷是否需要手動觸發(fā)GC或優(yōu)化對象生命周期。
4. 在Development Build中驗(yàn)證
若條件允許,在開啟Development Build的服務(wù)器上運(yùn)行測試,對比各項(xiàng)內(nèi)存指標(biāo)是否符合預(yù)期。
綜上,該現(xiàn)象主要由GetTotalReservedMemoryLong在非開發(fā)版中的局限性所致,應(yīng)以GetMonoHeapSizeLong和系統(tǒng)級內(nèi)存監(jiān)控作為主要依據(jù)。
有經(jīng)驗(yàn)的朋友歡迎轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/68afb897244ce21ce9ec090d
無論是社區(qū)里開發(fā)者們的互助討論,還是AI基于知識沉淀的快速反饋,核心都是為了讓每一個技術(shù)難題都有解、每一次踩坑都有回響。本期分享分別來自UWA AI問答和UWA問答社區(qū),希望這些從真實(shí)開發(fā)場景中提煉的經(jīng)驗(yàn),能直接幫你解決當(dāng)下的技術(shù)卡點(diǎn),也讓你在遇到同類問題時,能更高效地找到破局方向。
封面圖來源于網(wǎng)絡(luò)
今天的分享就到這里。生有涯而知無涯,在漫漫的開發(fā)周期中,我們遇到的問題只是冰山一角,UWA社區(qū)愿伴你同行,一起探索分享。歡迎更多的開發(fā)者加入UWA社區(qū)。
UWA官網(wǎng):www.uwa4d.com
UWA社區(qū):community.uwa4d.com
UWA學(xué)堂:edu.uwa4d.com
點(diǎn)擊下方名片關(guān)注我們,將我設(shè)為星標(biāo),及時接收小編每日推送哦,性能優(yōu)化不迷路~
近期精彩回顧
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.