Unity3D项目实战笔记(12):手游优化之异步策略

     前面曾提到过《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份不同代码,也省的每次切换配置可能导致的这种手误错误。

Avatar

Author: Instagram老王

学习心得、技术分享、Instagram社交营销技术攻坚。