1)如何定位游戲發(fā)熱問(wèn)題
2)Unity獲取指定腳本的引用對(duì)象
3)如何知道打包時(shí)的一個(gè)Shader有多少變體
4)如何優(yōu)化Font.CacheFontForText頻繁造成的耗時(shí)峰值
這是第300篇UWA技術(shù)知識(shí)分享的推送疑枯。今天我們繼續(xù)為大家精選了若干和開(kāi)發(fā)儡嘶、優(yōu)化相關(guān)的問(wèn)題,建議閱讀時(shí)間10分鐘,認(rèn)真讀完必有收獲山害。
UWA 問(wèn)答社區(qū):answer.uwa4d.com
UWA QQ群2:793972859(原群已滿員)
Performance
Q:目前項(xiàng)目的發(fā)熱問(wèn)題很頭疼遣疯,2D游戲偎窘,基于TileMap蝇闭、SpriteRenderer和UGUI的渲染,關(guān)閉了垂直同步躏将,TargetFrameRate設(shè)置為60锄弱。Android和iOS上發(fā)熱都很嚴(yán)重,而且在比較好的機(jī)型(比如iPhone 12這種)祸憋,發(fā)熱現(xiàn)象甚至更明顯会宪。
跟大部分情況不同,發(fā)熱并沒(méi)有怎么影響幀率蚯窥,在大部分機(jī)型上掸鹅,幀率都不是問(wèn)題塞帐,連iPhone 8機(jī)型,都能60幀跑滿巍沙。
在Unity Profile和Xcode都進(jìn)行過(guò)性能分析葵姥,CPU最明顯的熱點(diǎn)函數(shù)就是Spine的骨骼動(dòng)畫(huà)更新計(jì)算。然而到一個(gè)沒(méi)有骨骼動(dòng)畫(huà)的場(chǎng)景赎瞎,發(fā)熱現(xiàn)象稍好點(diǎn)牌里,但還是比預(yù)期的要燙不少(場(chǎng)景中除了地面和一些靜態(tài)貼圖颊咬,基本就沒(méi)有多少東西)务甥。
另一個(gè)比較普遍的發(fā)熱點(diǎn)是網(wǎng)絡(luò)測(cè)試,在某場(chǎng)景關(guān)閉網(wǎng)絡(luò)后喳篇,發(fā)熱依然嚴(yán)重敞临。甚至啟動(dòng)游戲,停留在登錄界面一會(huì)兒麸澜,發(fā)熱現(xiàn)象都比別的游戲更明顯挺尿。
猜測(cè)是否由于每幀的頂點(diǎn)數(shù)量過(guò)多造成的,在游戲中Unity的Status面板炊邦,頂點(diǎn)數(shù)量Verts達(dá)到了40KB编矾,三角形Tris也有幾乎20KB∧俸Γ看起來(lái)很多窄俏,但我不太清楚當(dāng)前主流游戲這個(gè)數(shù)值的級(jí)別大概是多少。而且碘菜,頂點(diǎn)和三角形的數(shù)量很難解釋登錄界面依然容易發(fā)熱凹蜈,畢竟登錄界面這些數(shù)值不可能很高。
自己也做了很多測(cè)試了忍啸,實(shí)在搞不清楚問(wèn)題究竟在哪兒仰坦,Unity是還有什么特別需要優(yōu)化的,針對(duì)發(fā)熱的點(diǎn)嗎计雌?
A1:可以用Xcode抓幀看看帶寬悄晃,Load Store Action是否合理。
感謝littlesome@UWA問(wèn)答社區(qū)提供了回答
A2:以下是我的建議:
1. iPhone 8上跑滿60幀凿滤,證明CPU妈橄、GPU都沒(méi)有到達(dá)瓶頸,消耗在較為合理的范圍鸭巴。推薦在Unity Profiler看一下CPU端的消耗眷细,以及查看一下DrawCall數(shù)量。
2. 推薦使用FrameDebugger鹃祖,看一下是否有冗余的物體或者后處理在渲染溪椎,尤其是你說(shuō)的啟動(dòng)界面有發(fā)熱。
3. 如果低級(jí)錯(cuò)誤都排查過(guò)了,那么建議看一下是否用了原生的插件校读。
4. 渲染的分辨率是否調(diào)整過(guò)了沼侣,RenderScale的值和FrameDebugger可以查出來(lái)分辨率。
感謝張振東@UWA問(wèn)答社區(qū)提供了回答
A3:關(guān)于發(fā)熱的問(wèn)題歉秫,通常要從幾個(gè)角度排查:CPU壓力(耗時(shí))蛾洛、GPU壓力(耗時(shí)和帶寬,可以考慮降低分辨率看看發(fā)熱問(wèn)題是否會(huì)有改善)和IO等幾個(gè)角度雁芙。從題主的問(wèn)題上看轧膘,耗時(shí)應(yīng)該是沒(méi)問(wèn)題,都能跑滿幀(當(dāng)然60幀本身就是對(duì)發(fā)熱影響比較大的一點(diǎn)兔甘,可以看看限制30幀會(huì)不會(huì)發(fā)熱有下降)谎碍,所以要看看一些隱形的東西是否有問(wèn)題。比如帶寬洞焙,可以用Snapdragon在高通手機(jī)上跑一跑蟆淀。如果帶寬較高,看看紋理的一些設(shè)置是否合理澡匪,比如是否壓縮熔任、是否開(kāi)啟Mipmap,這兩項(xiàng)通常都是需要設(shè)置成開(kāi)啟的唁情。還可以查看是否有不必要的BlitCopy操作疑苔,在URP項(xiàng)目中比較容易出現(xiàn)Copy Color和Copy Depth浪費(fèi)。對(duì)于IO荠瘪,需要看看是否存在子線程里面有頻繁IO的現(xiàn)象夯巷。
感謝Xuan@UWA問(wèn)答社區(qū)提供了回答,歡迎大家轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/62910e1ab87a457351669b0c
Script
Q:Unity獲取指定腳本的引用對(duì)象:一個(gè)GameObject上掛載了一個(gè)Script哀墓,這個(gè)Script引用了很多資源趁餐。如何只獲得這個(gè)Script引用的資源呢?AssetDatabase是會(huì)獲取所有的引用篮绰,但是并沒(méi)有做區(qū)分后雷。
A1:有Guid可以使用以下代碼加載:
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
var texture2D = AssetDatabase.LoadAssetAtPath(assetPath);
感謝蕭小俊@UWA問(wèn)答社區(qū)提供了回答
A2:通過(guò)SerializedObject拿到了所有的ObjectReference,然后AssetDatabase.GetAssetPath獲取對(duì)應(yīng)路徑:
感謝題主null@UWA問(wèn)答社區(qū)提供了回答吠各,歡迎大家轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/6291b10cb87a457351670c7e
Shader
Q:有什么方法可以知道打包的時(shí)候的一個(gè)Shader有多少變體臀突?
A:直接使用Unity提供的回調(diào)函數(shù),該函數(shù)會(huì)在Shader被打包(無(wú)論是打AssetBundle包還是Build的時(shí)候)時(shí)自動(dòng)調(diào)用贾漏。
如圖的三個(gè)參數(shù):“shader”表示回調(diào)函數(shù)當(dāng)前在處理的Shader資源候学,”data”是參與編譯的變體列表。所以data.count()就是該Shader資源的(參與編譯的)變體數(shù)量了纵散。所以梳码,只要在回調(diào)函數(shù)邏輯里把這兩個(gè)參數(shù)Log輸出就行了隐圾。
感謝Faust@UWA問(wèn)答社區(qū)提供了回答,歡迎大家轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/629d6e39b87a4573517010b0
UGUI
Q:請(qǐng)問(wèn) Font.CacheFontForText頻繁造成耗時(shí)峰值掰茶,該如何優(yōu)化暇藏?
A:可以參考這篇文章:《Unity3D UGUI 優(yōu)化:Font.CacheFontForText》
Font.CacheFontForText是在Text渲染時(shí),當(dāng)對(duì)應(yīng)字體的FontTexture找不到需要渲染的字符時(shí)濒蒋,就會(huì)重新生成FontTexture盐碱,F(xiàn)ontTexture尺寸越大,重新生成這張F(tuán)ontTexture就越耗時(shí)沪伙。
因此為了減少運(yùn)行過(guò)程中該函數(shù)造成的耗時(shí)峰值瓮顽,可以事先渲染所需要的字符,避免在運(yùn)行時(shí)出現(xiàn)重新生成FontTexture焰坪。
使用UWA的GOT Online工具驗(yàn)證了一下上面所提到的解決方案趣倾,結(jié)果對(duì)比如下所示:
優(yōu)化后之所以還是存在部分Font.CacheFontForText的耗時(shí)峰值聘惦,是因?yàn)樵跍y(cè)試后期又渲染了之前FontTexture中沒(méi)有的字符某饰。
感謝宗卉軒@UWA問(wèn)答社區(qū)提供了回答,歡迎大家轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/629d6710b87a45735170097b
封面圖來(lái)源于網(wǎng)絡(luò)
今天的分享就到這里善绎。當(dāng)然黔漂,生有涯而知無(wú)涯。在漫漫的開(kāi)發(fā)周期中禀酱,您看到的這些問(wèn)題也許都只是冰山一角炬守,我們?cè)缫言赨WA問(wèn)答網(wǎng)站上準(zhǔn)備了更多的技術(shù)話題等你一起來(lái)探索和分享。歡迎熱愛(ài)進(jìn)步的你加入剂跟,也許你的方法恰能解別人的燃眉之急减途;而他山之“石”,也能攻你之“玉”曹洽。
官網(wǎng):www.uwa4d.com
官方技術(shù)博客:blog.uwa4d.com
官方問(wèn)答社區(qū):answer.uwa4d.com
UWA學(xué)堂:edu.uwa4d.com
官方技術(shù)QQ群:793972859(原群已滿員)