小丸工具箱官方网站
前言
项目上需要加载多个地图,每个地图的贴图将近200M,所有地图加起来贴图将近2G。因此,想着能不能将贴图放到工程外加载,逐研究小丸工具箱改变帧率了一下,得出了三种加载方式,分别是WWW加载、C#原生的IO加载在转换成Texture2D和Assetbundle打包和加载。
前面两种方式都会存在卡顿现象,因为最消耗性能的计算方式最终都还是放在主线程里。尽管第二种方式可以使用另外一个线程加载图片成Bytes数组,但是将字节数组转成成Texture2D还是在主线程里,而这个过程在图片5M的时候还是很卡顿,何况我的地形贴图每张有20M左右。对于前面两种方式没有找到任何其小丸工具箱改变帧率他好的优化方式来解决。第三种方式是我用到最理想的,在加载的过程中不会有卡顿。
WWW加载
首先,获取当前工程同目录下的“MapImages”文件夹路径,然后获取每张图片的全部路径,并将路径存到列表中。
展开全文
然后根据路径列表使用WWW逐个加载图片
效果图如图所示:一开始显示的是默认模糊处理的贴图,在加载的过程中帧率非常低,造成卡顿。
这里的地形贴图都很大,就算单张图片压缩到4M左右,使用LoadImage方法还是会卡顿。而这个方法又只能在主线程里使用,也即不能在新开的加载线程里使用。Unity对这类的类都限制了,只能在主线程使用。
Assetbundle打包再加载
首先,要将贴图导入到Unity工程里面,然后对一个文件夹里的贴图进行打包。.0之后的打包方式比较简单,如图所示:
先选中要打包的贴图,在Inspectors面板下有个AssetBundle,这里新建小丸工具箱改变帧率你要打包成集合的名字,我以文件夹的名字新建了一个标签“40_73.4_36.69237_77.61875”。选中文件夹里其他图片,将它们都设置成这个标签。这样就可以将整个文件夹里的图片打包成一个集合,方便一次性加载。
打包的代码和简单,可以在Editor文件下,创建一个编辑脚本,代码如下:
对比以前的方式,新的打包方法确实简化方便了很多。接下来将打包好的Assetbundle文件夹放到工程的同级目录下,加载Assetbuudle的代码如下:
加载得到集合包,然后根据每个图片的文件名得到具体的图片。最终的效果图如图所示:
可以看到帧率几乎不受任何影响,但是会在加载到显示的过程中停留2秒时间左右,对于程序的卡顿,这个时间的停滞还是可以接受的。
总结
虽然,第三种方式在加载的时候比较流畅,不会影响到主线程的执行。但是,打包的过程也是一个很繁琐,且需要细致认真的工作。总的来说第三种方式最好的,前面两种方式应该用在其他方面,几天的研究算是作为一个记录,或许以后就能用的上。最后附上三种方式的工程文件和贴图,
阅读原文参与留言交流,工作一直很忙,对没有看到留言并及时回复的童鞋表示抱歉。