ios开发中计算代码运算时间_理解Unity中的优化(二):内存
內(nèi)存:
內(nèi)存消耗是一個(gè)關(guān)鍵的性能指標(biāo),尤其是在內(nèi)存資源有限的平臺(tái)上,比如低端移動(dòng)設(shè)備。
內(nèi)存消耗分析:
在Unity中診斷內(nèi)存問(wèn)題,Unity介紹了一款開(kāi)元的可視化內(nèi)存分析工具——MemoryProfiler,地址:https://bitbucket.org/Unity-Technologies/memoryprofiler
這個(gè)工具兼容了Unity高于5.3的所有版本。在對(duì)用IL2CPP編譯出來(lái)的游戲進(jìn)行內(nèi)存分析時(shí),它能捕獲到很多托管代碼內(nèi)存消耗的信息。
要使用MemoryProfiler,先用IL2CPP打包一個(gè)簡(jiǎn)單的項(xiàng)目,安裝到測(cè)試機(jī)上。連接上Unity的Profiler,并且打開(kāi)內(nèi)存分析窗口,選擇Take Snapshot。
當(dāng)數(shù)據(jù)被收集并傳輸?shù)経nity編輯器時(shí),運(yùn)行的游戲會(huì)有短暫的停頓。然后,Unity編輯器會(huì)解析接受到的數(shù)據(jù),這可能需要大量的時(shí)間。對(duì)一款占用內(nèi)存較多的游戲來(lái)說(shuō),這可能會(huì)花10-30分鐘。
Unity建議我們耐心等待。當(dāng)然,這需要我們自己作出衡量,用這款工具或者使用其他內(nèi)存分析工具。
上面的屏幕截圖取自IOS設(shè)備上的一個(gè)Unity標(biāo)準(zhǔn)庫(kù)中的場(chǎng)景。它展示了四分之三的內(nèi)存都是被飛機(jī)機(jī)身的貼圖占用了。點(diǎn)積上圖中的每個(gè)小方塊,就能獲取到詳細(xì)的信息。
識(shí)別重復(fù)的貼圖:
在項(xiàng)目開(kāi)發(fā)中,我們會(huì)遇到的共同問(wèn)題就是內(nèi)存中的重復(fù)資源,表現(xiàn)最為明顯的,就是貼圖重復(fù)。
通常,如果兩個(gè)資源的類型和大小相同,那么它們可能加載自同一資源,可能就是重復(fù)的資源。在MemoryProfiler的面板中,對(duì)于看起來(lái)差不多的兩個(gè)對(duì)象,可以檢查Name和InstanceID這兩個(gè)字段。
Name字段不多說(shuō),InstanceID是Unity運(yùn)行的時(shí)候被分配的,這個(gè)值是唯一的。
上圖是展示貼圖重復(fù)問(wèn)題的一個(gè)簡(jiǎn)單示例,取自MemoryProfiler5.4版本。
圖中內(nèi)存中加載了兩份貼圖。這兩份貼圖具有相同的名稱和大小,這可能就出現(xiàn)了貼圖重復(fù)的問(wèn)題。然后,檢查項(xiàng)目中名為“wood-floorboards-texture”的貼圖,發(fā)現(xiàn)只有一份。就可以確定資源已經(jīng)重復(fù)加載了。
每一個(gè)UnityEngine.Object對(duì)象,在創(chuàng)建完成的時(shí)候,都會(huì)被賦予一個(gè)唯一的Instance ID。上圖中的兩個(gè)貼圖具有不同的Instance ID,可以確定它們代表了兩組不同的貼圖數(shù)據(jù)被加載到了內(nèi)存中。
但是這兩個(gè)貼圖的大小和名稱是相同的,只有Instance ID不同,就可以確定這兩個(gè)貼圖加載自同一貼圖,而且在內(nèi)存中已經(jīng)重復(fù)加載了(注意:如果項(xiàng)目中的兩張貼圖具有相同的文件名,那么我們只通過(guò)文件名來(lái)判斷就會(huì)出現(xiàn)問(wèn)題,所以我們還需要比較資源的大小)。
AssetBundle中的資源重復(fù):
AssetBundle中的資源重復(fù)問(wèn)題大多數(shù)是由于沒(méi)有正確的卸載AssetBundle包導(dǎo)致的。詳細(xì)的描述可以參考Unity的官方文檔
A guide to AssetBundles and Resources - Unity?unity3d.com重點(diǎn)參考上文中的AssetBundle usage patterns章節(jié)。
檢查image buffer, Image Effect & RenderTexture內(nèi)存使用:
在MemoryProfiler中,也可以看到Image Effect和RenderTexture的render buffers占用的內(nèi)存大小。
上面的截圖展示了一個(gè)簡(jiǎn)單的場(chǎng)景,其中應(yīng)用了一些攝像機(jī)后期效果(Cinematic Image Effects)。這部分圖像效果為了執(zhí)行各自的運(yùn)算,會(huì)分配臨時(shí)的渲染緩沖(render buffer),尤其是光暈效果(Bloom effect)會(huì)分配多個(gè)遞減大小的緩沖。由于IOS設(shè)備的高清視網(wǎng)膜技術(shù),這些臨時(shí)的緩沖會(huì)比項(xiàng)目中的其他資源消耗更多的內(nèi)存。
一個(gè)全屏的臨時(shí)渲染緩沖區(qū)會(huì)占用24-36MB內(nèi)存。這取決于緩沖區(qū)的格式。在不影響視覺(jué)效果的前提下,我們可以調(diào)小渲染緩沖的大小來(lái)減少內(nèi)存的占用。
優(yōu)化圖像特效占用的臨時(shí)緩沖區(qū)和其他GPU資源的另一種方法是創(chuàng)建一個(gè)單一的“uber”Image Effect,讓它執(zhí)行所有不同的計(jì)算。當(dāng)使用Unity5.5或者更新版本時(shí),也可以使用UberFX(可以從github中獲得,地址:https://github.com/Unity-Technologies/PostProcessing)。下載包中提供了一個(gè)可配置的“uber”Image Effect,它能執(zhí)行所有的攝像機(jī)后期效果的運(yùn)算,而且占用的資源要比單個(gè)的Image Effect要少。
本文內(nèi)容來(lái)自Unity官方文檔:
Unity - Manual: Memory?docs.unity3d.com作者水平有限,如有錯(cuò)誤請(qǐng)多加指正。
總結(jié)
以上是生活随笔為你收集整理的ios开发中计算代码运算时间_理解Unity中的优化(二):内存的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python小白的数学建模课-05.0-
- 下一篇: 如何删除Win All的流氓程序文件