经过一周的时间,差不多才解决了这个问题一定要记录一下.
主要遇到的困难就是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图片都会怎么处理