目錄
策略導(dǎo)致的內(nèi)存問題
GFX內(nèi)存
紋理資源
壓縮格式
Mipmap
網(wǎng)格資源
Read/Write
頂點(diǎn)數(shù)據(jù)
骨骼
靜態(tài)合批
Shader資源
Reserved Memory
RenderTexture
動(dòng)畫資源
音頻資源?
字體資源
粒子系統(tǒng)資源
Mono堆內(nèi)存
策略導(dǎo)致的內(nèi)存問題
1. Assetbundle 打包的時(shí)候,單個(gè)資源被重復(fù)打包,可以把依賴的資源,單個(gè)打包,通過AssetBundleBrowser 可以查看Assetbundle里面的資源情況,地址:Unity Technologies · GitHub
2. 代碼使用不當(dāng),資源加載后沒有及時(shí)銷毀,比如:
var gos = Resources.Load<GameObject>("Sphere");
GameObject go = Instantiate(gos);
Material ma = go.GetComponent<Renderer>().material;
ma.color = new Color(1, 0.5f, 0.5f);
//Destroy(ma);
Destroy(go);
?在內(nèi)存里面還是會(huì)存在一份material,因?yàn)槊看卧O(shè)置color的時(shí)候,都是創(chuàng)建了一個(gè)新的material
3. Assetbundle 的卸載不當(dāng),導(dǎo)致資源冗余,Unload(false),會(huì)把加載的assetbundle 卸載,但從里面加載的資源還在,Unload(true),都會(huì)卸載
GFX內(nèi)存
GFX內(nèi)存(Graphics)是指圖形處理器(GPU)的專用內(nèi)存,用于存儲(chǔ)圖形數(shù)據(jù)和計(jì)算所需的臨時(shí)數(shù)據(jù)。
紋理資源
壓縮格式
1. 圖片在導(dǎo)入unity的時(shí)候,會(huì)轉(zhuǎn)換成unity識(shí)別的的格式,比如jpg,png,這些是在硬盤上存儲(chǔ)的格式,但不能不GPU直接讀取,所以導(dǎo)入的時(shí)候會(huì)轉(zhuǎn)換成ETC、ASTC 格式
2. 圖片壓縮的好處:
減少占用內(nèi)存、減少帶寬、減少加載時(shí)間
3. 如果圖片的壓縮格式,在該平臺(tái)上不支持,會(huì)轉(zhuǎn)換成RGBA格式,即不壓縮
4. Android支持ETC/ASTC; IOS 支持 ASTC/PVRTC; PC 支持DTX
5. ASTC 可以調(diào)節(jié)壓縮塊的大小,來調(diào)節(jié)壓縮比例,因?yàn)锳STC 是以固定128bit 來存儲(chǔ)一個(gè)塊的,塊里面的像素越多,壓縮比例就越大,因?yàn)槠綌偟矫總€(gè)像素的存儲(chǔ)空間越少,比如4x4,6x6,8x8
Mipmap
1. mipmap 的好處及壞處
好處:減少帶寬? 壞處:增加內(nèi)存
2. 原理
存儲(chǔ)的圖片內(nèi)存是等比數(shù)列,1、1/4、1/16......,內(nèi)存和是原來的4/3倍,也就是內(nèi)存增加了1/3
3. 對(duì)于2D 界面,因?yàn)閿z像機(jī)距離不會(huì)發(fā)生變化,所以要關(guān)閉mipmap,3D 物體或UI可以根據(jù)情況開啟Mipmap
4. 通過Texture Quality 改變加到到內(nèi)存的Mipmap的數(shù)量,從而實(shí)現(xiàn)不同性能的機(jī)器,配置不一樣
通過Edit-Project Settings-Quality--Textures修改,只對(duì)開啟了Mipmap的紋理生效,里面的FullRes、HalfRes 等內(nèi)存依次降低為原來的1/4
5. Texture Streamming 動(dòng)態(tài)改變加載到內(nèi)存的Mipmap的數(shù)量
只對(duì)動(dòng)態(tài)加載的Mipmap紋理有效,比如assetbundle加載,如果場景已經(jīng)存在該紋理,且通過加載場景的方式加載,Texture Streamming則不會(huì)生效,因?yàn)榧y理已經(jīng)存在了,無法動(dòng)態(tài)改變
紋理加載會(huì)根據(jù)物體和攝像機(jī)的位置,動(dòng)態(tài)實(shí)時(shí)的去ab包內(nèi)加載Mipmap
生效條件:紋理開啟texture streaming 和 generate Mipmap
MaxLevelReduction(最多裁剪的層級(jí)) 的優(yōu)先級(jí)>Memroy Budget (mipmap 占用的最大內(nèi)存)
網(wǎng)格資源
Read/Write
CPU和CPU會(huì)各占一份內(nèi)存,如果不需要在代碼中修改mesh,就不要開啟該選項(xiàng)
頂點(diǎn)數(shù)據(jù)
一份網(wǎng)格的頂點(diǎn)數(shù)據(jù)有很多,比如position、color、tangent等,但是切線一般是在計(jì)算光照的時(shí)候才用,可以在導(dǎo)入模型的時(shí)候,model 欄下,設(shè)置tangent為none,也可以通過projectsetting里面開啟optimize mesh data,它會(huì)裁剪沒有用到的頂點(diǎn)屬性,需要測試
骨骼
如果模型不需要骨骼數(shù)據(jù),則在模型導(dǎo)入的RIG欄,設(shè)置animation type為none
靜態(tài)合批
會(huì)增加內(nèi)存,空間換時(shí)間
Shader資源
1. shader占用的內(nèi)存,只要是shader變體,每一個(gè)變體都會(huì)產(chǎn)生一個(gè)shader,加載到內(nèi)存里面
2. 游戲初始化的時(shí)候一般需要提前把渲染要使用的Shader全部都加載進(jìn)來,以降低游戲運(yùn)行時(shí)及時(shí)加載和編譯帶來的卡頓,這時(shí)候我們可以調(diào)用Shader.WarmupAllShaders來把當(dāng)前已經(jīng)加載到內(nèi)存的Shader全部編譯一次,包含所有的變體。
3. 隨著項(xiàng)目渲染效果的豐富,Shader變體變得越來越多,粗暴的調(diào)用全加載接口,會(huì)導(dǎo)致游戲的啟動(dòng)時(shí)間變得更長,影響游戲體驗(yàn)。
4. 后來Unity加入了變體集合ShaderVariantCollection來取代上面的粗暴全加載接口,達(dá)到按需加載,提高加載速度
5. 優(yōu)化方向:裁剪shader變體
地址:https://answer.uwa4d.com/question/5da86670e84db43d6efbda72
?
Reserved Memory
RenderTexture
適當(dāng)關(guān)閉抗鋸齒,或者降低抗鋸齒的質(zhì)量、減少陰影貼圖的質(zhì)量,即分辨率、降低RT的存儲(chǔ)位數(shù)(代碼生成的時(shí)候設(shè)置),HDR如果不使用alpha通道的情況,可以修改格式為R11G11B10,即32為存儲(chǔ)格式
動(dòng)畫資源
1. 勾選Resample Code,在模型導(dǎo)入的animation欄中,默認(rèn)開啟,它會(huì)減少關(guān)鍵幀的數(shù)量
2. 壓縮animation
3. 骨骼動(dòng)畫,不用scale,剔除不用的scale曲線,通過編輯器代碼,AnimationUtility
4. 降低動(dòng)畫存儲(chǔ)的float精度,從而使其存儲(chǔ)方式為constant,減少內(nèi)存
5. 選中animation,可以在屬性面板看到其詳細(xì)信息
音頻資源?
1. ForceToMono:把雙聲道音頻合并成單聲道
2. LoadType:?
Decompress On Load:加載后,解壓縮,以未壓縮的方式存儲(chǔ)在內(nèi)存上
Compress in memory:以壓縮方式存儲(chǔ)在內(nèi)存上,播放時(shí)解壓縮
Stream:邊解壓縮邊播放,但是每播放一次都會(huì)增加一份緩存
對(duì)于不經(jīng)常播放的,長而大的背景音樂,用stream,對(duì)于短且頻繁用第一種(搶聲)、其它中等音樂用第二種
3.壓縮格式
壓縮率越小,壓縮后占用的文件內(nèi)存越小,ADPCM壓縮格式,占用內(nèi)存最小,配合Compress in memory使用
PCM:不壓縮、Mp3:次之、Vorbis:更次之、ADPCM:最小
字體資源
1. 字體瘦身:有些字體不使用,可以裁剪掉,工具推薦:FontSubsetGUI、FontPruner
2. 字體壓縮:TMP 生成的字體問題太大,不能改變,通過提取其紋理,然后壓縮,再賦值的方式,壓縮紋理
粒子系統(tǒng)資源
1. 粒子占用的內(nèi)存和實(shí)際播放的粒子數(shù)有關(guān),和最大粒子數(shù)無關(guān)
2. 如果粒子沒播放,也會(huì)占用一部分內(nèi)存,比如:粒子系統(tǒng)只是被關(guān)閉了,沒刪除
Mono堆內(nèi)存
1. 常駐內(nèi)存過高:比如list、dictionary、數(shù)組,初始化時(shí)的內(nèi)存不要過高
2. 持續(xù)分配內(nèi)存:每一萬幀,分配不超過50M,通過在初始化時(shí)緩存變量
?文章來源:http://www.zghlxwxcb.cn/news/detail-615177.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-615177.html
到了這里,關(guān)于Unity 性能優(yōu)化二:內(nèi)存問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!