Q1:iOS上PVRTC不支持NPOT的貼圖壓縮喇潘,在Android上可以用ETC2,但在iOS上不能壓縮遵堵,內(nèi)存消耗大箱玷。請問在iOS上有沒有好的處理方案?
ETC2僅能在支持OpenGL ES3.0的手機上進行使用陌宿,請研發(fā)團隊在使用前謹慎考察支持ES3.0的手機在國內(nèi)的覆蓋范圍锡足。
PVRTC不支持NPOT的貼圖壓縮,這是Apple規(guī)定的壳坪,上層應用無權對此更改舶得。我們僅能建議將紋理盡可能做成POT形式,否則只能接受內(nèi)存較大的開銷爽蝴,沒有其他更好的辦法沐批。
Q2:Unity對Dynamic Batching的數(shù)量是否有限制?或者說對Saved by Batch的數(shù)量是否有限制蝎亚?
Unity對于任何Mesh的面片都有65536的個數(shù)限制九孩,拼合后的面片數(shù)也是如此。
Q3:請問游戲中特效使用的很多貼圖, 一般有什么好的方式去管理嗎 ? 不合并圖集的話會有上千張小的透明貼圖, 合并圖集又會有占用內(nèi)存過多的問題发框。
可以合并成Atlas躺彬,一般將盡可能同時出現(xiàn)頻率較高的Texture合成Atlas,這樣并不會造成內(nèi)存過大梅惯。在這方面也可以參考我們前不久推薦的插件Mesh Baker宪拥。
Q4:在同一場景里烘培的Lightmap,我用了2張10241024的光照圖个唧,大小是5.3MB江解;別人用了3張10241024的圖,大小是4.3MB徙歼。請問是什么影響這個光照圖的大小犁河,在哪里調(diào)鳖枕?
首先,請確認下Lightmap的類型桨螺,Single類型只生成一張宾符,而Dual和Directional會生成兩張。 其次灭翔,請確認下當前的發(fā)布平臺魏烫,Android下的Lightmap會比Standalone更小。因為不同平臺采用的壓縮格式不同肝箱。此外哄褒,Lightmapping中的Lock Atlas,Resolution煌张,Padding等選項也會影響最后烘焙光照圖的大小呐赡。
Q5:我們打出來的ipa包大概有220MB ,相同的資源APK包只有120MB左右骏融, 相差100多MB 链嘀。我們查過網(wǎng)上其他已上市游戲的ipa,apk兩個包,兩個包體都只相差15~30MB档玻,請問我們這種情況是否正常怀泊,有沒有辦法進一步壓縮ipa安裝包?
首先误趴,放在項目工程Resources文件夾下的文件都會被打包進resources.assets霹琼,為了減小發(fā)布包的大小,在發(fā)布的時候請?zhí)蕹齊esources里以及streamingassets里不必要的文件冤留。
其次Unity有篇官方文檔碧囊,專門介紹了如何減小發(fā)布包的體積树灶。
Q6:下圖一是剛進游戲時獲取的信息纤怒,第二張是開關幾次同一個UI界面后獲取,對比兩圖我們發(fā)現(xiàn)有多份重復的Texture天通。請問這是為什么泊窘?我們的加載方式是UI通過AssetBundle加載,加載后會釋放AssetBundle像寒,然后再次加載 UI 就會造成紋理資源的冗余烘豹。
(圖我省略了)
<ul><li>剛進游戲時獲取的圖中出現(xiàn)的“重復”資源可能并不是冗余,因為 Atlas的一個 Group 中可能包含多張一樣大小的Page(即紋理)诺祸,而這幾個Page在內(nèi)存中的名字是一樣的携悯。</li><li>但是,如果同一UI界面多次開啟后筷笨,內(nèi)存中出現(xiàn)了更多同樣的資源憔鬼,則說明UI的管理方式存在一定問題龟劲。對于頻繁使用的UI,我們建議在加載之后通過緩沖池對其進行緩存轴或,后續(xù)使用時昌跌,直接通過緩沖池獲取即可。而不要每次均通過AssetBundle進行加載照雁,這種做法既會造成更大的CPU占用蚕愤,同樣會很大幾率造成資源的冗余。</li><li>同時饺蚊,如果多次開啟的是不同UI界面萍诱,并且造成內(nèi)存中同種資源的增加,則很有可能是UI在AssetBundle打包時形成了冗余(這種情況在目前的UGUI系統(tǒng)中較為常見)污呼。對此砂沛,如果開發(fā)團隊使用的是UGUI,那么我們的建議如下:</li>1.對于使用Unity 5.x的新AssetBundle打包系統(tǒng)曙求,則打包時盡可能將同種Atlas的UI界面打成一個AssetBundle文件碍庵,否則將很有可能出現(xiàn)資源冗余的情況;
2.對于使用Unity 4.x的老AssetBundle打包系統(tǒng)悟狱,則可以將一個含有Atlas的Prefab(或其他Object)先打包静浴,其他UI元素對其進行依賴即可。
此外挤渐,開發(fā)團隊可以考慮用 WWW.LoadFromCacheOrDownload 來加載共享包苹享,因為 new WWW 的方式會在內(nèi)存中形成 WebStream 造成較多的內(nèi)存開銷。關于該函數(shù)的具體優(yōu)劣浴麻,開發(fā)者可以參考你應該知道的AssetBundle管理機制得问。</ul>
Q7: 請問粒子特效的Shader是否不能使用依賴打包? 我們對Shader的模型和特效使用了依賴打包软免,運行的時候發(fā)現(xiàn)模型顯示是正常的宫纬,但是粒子特效使用的Shader就不能正常運行,特效顯示不正常膏萧。而在編輯器中漓骚,我們看到Material中的Shader是存在的。這時候如果重新手動給這個Material指定同樣的Shader榛泛,這個粒子特效就能正常顯示蝌蹂,請問這是什么原因引起的?
部分 Shader 在打包到 Android 版本的 Assetbundle 之后曹锨,會因為平臺不兼容而無法正確顯示孤个,這是因為打包后的 Shader 代碼只保留了目標平臺的預編譯代碼,不一定能夠在 Editor 下運行沛简,所以這是正称肜穑現(xiàn)象硅急。 但這并不會影響依賴打包,因為在真機上并不會出現(xiàn)類似的問題佳遂。
Q8: iOS平臺需要對圖集做RGB和Alpha通道的分離嗎营袜?我發(fā)現(xiàn)在同樣大小的圖片(正方形),RGB Compressed PVRTC 4bits和RGBA Compressed PVRTC 4bits兩種格式丑罪,占用內(nèi)存是一樣的荚板,如果把一張圖片分成兩張,那么在iOS平臺是不是占用內(nèi)存多一倍吩屹?有透明通道的跪另,對于它的圖集怎么處理會更好一點?
通常iOS下是不需要做通道分離的煤搜,因為 iOS 通用的 PVRTC 格式支持 Alpha 通道免绿。但目前也有團隊反饋,在 iOS 上進行通道分離有助于減少失真擦盾,可以在一定程度上提高視覺效果嘲驾,因此也可以嘗試做一個對比。
如果發(fā)現(xiàn)占用內(nèi)存是一樣的迹卢,那么原始圖片是RGB的辽故。如果iOS上做通道分離,內(nèi)存確實會增加一倍腐碱。UI的紋理在iOS下可以直接選擇默認的 Compress誊垢,在打Atlas時會自動處理成 PVRTC,開發(fā)團隊可以從Sprite packer窗口來看Atlas的壓縮格式做個確認
Q9:我有一個UI預設症见,它使用了一個圖集喂走, 我在打包的時候把圖集和UI一起打成了AssetBundle。我在加載生成了GameObject后立刻卸載了AssetBundle對象谋作, 但是當我后面再銷毀GameObject的時候發(fā)現(xiàn)圖集依然存在芋肠,這是什么情況呢?
這是很可能出現(xiàn)的瓷们。unload(false)卸載AssetBundle并不會銷毀其加載的資源 业栅,是必須調(diào)用 Resources.UnloadUnusedAssets才行秒咐。關于AssetBundle加載的詳細解釋可以參考我們之前的文章:你應該知道的AssetBundle管理機制谬晕。
Q10:Prefab中的GameObject的tag設置為EditorOnly仍然會被打進Resoures包嗎?有其它EditorOnly方案嗎携取?
EditorOnly理論上只對場景中的 GameObject起效攒钳。因此 Project 目錄中的 Prefab 打上 EditorOnly 后,放在 Resources 目錄下依然會被打進游戲包中雷滋。但只要將其放在 Resources 目錄以外不撑,則其就會因為沒有場景中的物件引用而被排除在外文兢。