經過一周的時間,差不多才解決了這個問題一定要記錄一下.
主要遇到的困難就是png文件在轉換為bytes文件后會出現白邊的現象
c# - How can I programatically load a texture into an Image the same way the Unity Editor does?這個地方將問題說明的很詳細.
因為我們項目會使用到大量的圖片資源(png格式),但是在iOS系統會有一個非常大的問題,iOS會默認按照最大格式來保存圖片.這將會導致包體安裝完之后非常的大.
比如
在Unity中會展開成
超了十多倍,而iOS則是已展開后的大小,計算圖片占用多大的空間,所以當這種圖片一旦成百上千,會導致安裝包和最后app大小的差別差的非常遠,我們游戲安裝包160多M,最后app是1G(OMG).
然后我照着Reducing Unity game file size這篇博客的思路來改變了原來處理這種圖片的流程,主要思路就是:bypassing Unity's content pipeline and loading the textures from the .png files in real time.具體做法是讓圖片文件從.png的文件后綴改變.bytes的后綴作為二進制的文件保存,在Runtime的時候通過Texture.LoadImage(byte[] bytes)的API來加載出圖片.
可是一個神奇的事情出現了,不同圖片間會出現很多的邊緣線
像這樣的情況,問了下主程,說原來的圖片在資源在導入的時候會把Generate Mip Maps取消勾選,並且勾選上Alpha is Transparent,可是我在代碼中這樣設置了沒有效果,后來想通過先把原來的.png文件在Unity中展開並且做好圖片設置后,再導出為.bytes文件保存,所以才有了個這個奇怪的問題,但是發現這種方式也不好,因為這樣的.bytes文件也會是展開后的大小,比如上面的手包圖片會按照143.9KB保存.
然后在Unity Answers中發現了一個大牛寫的png文件會有白邊的原因分析,Messy Alpha Problem,大概是因為PhotoShop中,會把100% Transparent的地方默認顏色值設為白色,這樣會導致在Runtime時,做圖片interpolation運算時候,由於這樣100%Transparent點的干擾使用會出現白邊的情況,大牛提出的解決方法是,在PS中,利用插件為這些100%Transparent點,填充上相鄰像素點的顏色,而由於我們的圖片資源太多了,讓美術一個一個改圖片也不現實,所以參考了一段Google上的代碼,通過代碼來完成了PS中插線的工作流程.PNG transparency has white border/halo,在這個問題中有這段代碼.至此問題基本解決,但是貌似性能消耗太多,不知道大家有沒有更好的辦法,或者大家在iOS平台對於大量的.png圖片都會怎么處理