文档介绍:word
word
1 / 11
word
NGUI制作UI,界面打开太慢解决方法
Uniyt3D利用NGUI打开界面太慢了,起初一直以为是unity的问题,最近经过我的全面测试我发现这和unity没有关系。
一般一个比拟复杂的word
word
1 / 11
word
NGUI制作UI,界面打开太慢解决方法
Uniyt3D利用NGUI打开界面太慢了,起初一直以为是unity的问题,最近经过我的全面测试我发现这和unity没有关系。
一般一个比拟复杂的界面大概需要150个GameObject  或者 UISprite 。
我用NGUI直接载入发现竟然需要250多毫秒,仅仅只是两X小图。同样的GameObject 我用unity2d的Sprite载入只需要70多毫米,可见Unity2d的效率要比NGUI高多少。我可能说的不完全对,因为U3D是闭源的,我只能猜测。
再普与一下根底知识:
GameObject go = ((“prefabName〞)) as GameObject;<Test>();
我想上面这一行代码,大家应该再也熟悉不过了。实例化一个Prefab,然后给它身上帮一条脚本。如如如下图所示,我用的是 红米作为测试机器。
实例化对象我们可以拆成4局部。我用NGUI加载了150个UISpirte = 41 + 4 + 30 + 194 = 269毫秒,一般打开界面超过500毫秒的话用户就会明显感觉卡顿了。
而我这个仅仅是一X图而已,事实证明NGUI加载太慢了,到底为什么这么慢?
word
word
2 / 11
word
〞同步〞耗时操作,Unity内部维护了资源的内存池,但是调用Load的时候Unity会自动的把Prefab上所引用的资源在参加内存池,它不会重复加载资源。也就是说当你加载一样的UIAtlas的时候,只会第一次比拟卡。你可以试试一些线上的unity游戏,一般第一次打开某界面的时候要比以后打开此界面时间长一些。
很多人认为加载慢的原因罪魁祸首是Instantiate()。其实我告诉你它的时间反而是最快的,上面的截图我相信就是最好的证明。
第一次Instantiate要比以后执行Instantiate要慢一些,可能Unity在做一些特殊处理吧。
word
word
3 / 11
word
添加脚本一般会有两种形式,第一种是通过Addponent<Script>的形式把脚本添加给游戏对象,还有一种是你的Prefab天生就带着这个脚本。
无论哪种加载时间都是一样的。第一次加载脚本要比以后加载慢,我觉得应该是和Resources缓存池的原理一样吧。
和 Addponent<Script>
就不用说了,它载入很快,这里要详细的说说Script。
对!导致于你界面打开慢的原因就是prefab上绑的脚本,罪魁祸首就是脚本。
Addponent<Script> 以后 或者  Prefab上预先绑定的脚本。()同步方法执行的时候,并不是把脚本挂上去就完了,而它要等脚本里面的一些方法执行完毕才算完毕。
脚本中有两个很典型的方法 Awake 和 OnEnable。当Prefab 用Instantiate()方法载入的时候,它的脚本必须执行完Awake和OnEnable两个方法以后才算完整载入。那么如果你的脚本这里面有一些耗时操作,那么必然载入会慢了。。
void Awake()
{
word
word
4 / 11
word
for(int i =0 ;i <1000; i++)
{
}
}
void OnEnable()
{
for(int i =0 ;i <1000; i++)
{
}
}
如果你在Awake() 或者 OnEnable()方法里面继续去实例化对象,继续绑定脚本,那么依然还需要把新实例化对象的 Awake()和 OnEnable()方法执行完毕才会完毕。。。
这里并没有完,还有一个地方也会引起打开界面慢。代码中用Pubilc 声明的对象,然后是在编辑器拖拽赋值。
public GameObject go;
word
word
5 / 11
word
拖拽赋值,如果是资源很大的话unity需要load ,然而load就是一个同步耗时操作,那么它也会影响打开界面的时间。
如如如下图所示,NGUI里面 UISprite UITe