前面曾提到过《prefab的插件方式》,结果大量使用prefab,导致几个重要的prefab非常重! 也导致了游戏加载“卡顿”,一点点分析得知,是因为Resource.Load(*.prefab)导致的,对于框架的Prefab,把他做的很大,实在不是什么好主意的:一级界面在prefab上即可,点击二级界面在动态加载,即大prefab化小,以减少用户体验明显的“卡顿”现象。
我的实践如下:
Step1:优先采用协成
private IEnumerator FinishProcessBar()
{
//Step1: 100%进度条
finish = true;
//Step2: 停止0.2s
yield return new WaitForSeconds(0.2f); //在100%进度条上,停止0.2f
//Step3: 切换页面
Controller.Get().PushNext();
}
但是有问题,仅仅这个方法是无法解决问题的,因为:
Coroutines aren’t async whatsoever – they’re completely synchronous with the main unity thread。
Coroutines 往往是主线程里面的,无法实现C#中的多线程效果。
Step2:查Unity自带的函数 Resources.LoadAsync
Unity4.5.3 新增的函数,可以动态异步加载资源,如prefab、大图片、声音文件等,使用也很简单。
req = Resources.LoadAsync("/Prefabs/Func1");
yield return req;
LLWindow = (GameObject)GameObject.Instantiate(req.asset); //5s
LLWindow.SetActive(false);
这里结合了协成和系统异步加载函数,完美解决问题.
类似的方案, AB也采用了– AssetBundle.LoadAssetAsync;
还可以异步加载场景—Application.LoadLevelAsync
Step3: 异步策略后,善后的事情
我在prefab的Enable函数中,多次用到了GC.Collect函数,希望尽快让Mono.NET及时回收不用的内存,但是这个却会导致手游卡顿现象–在红米测试机上体验,故得删除之:
GC.Collect(); 频繁调用,启动会导致程序"卡顿"
另外,“启动黑屏2~3s”问题:
打包Android APK包的时候,选择Script debuging、profiler、Development Build模式,也会导致启动“卡顿”,且包会增大2M ==》 调试完毕后后,及时记得去掉这些选项。
最重要的,一定要有一个打包的文件夹,开发的和打包时2份不同代码,也省的每次切换配置可能导致的这种手误错误。