NGUI中有一个控件,UIGrid,例如背包就会用这个实现。
当物品很多的时候,UIGrid打开就会很卡,网上也有人提出了优化的方法,但我认为全部重写有点小题大做,只要找到卡的原因就好了。
经过分析,有两个原因:
1.资源没有复用,这个其实非常简单,只要你自己弄一个对象池,然后不断复用grid就可以了。
2.只能一个个添加gird,没有批量添加方法,这个也很简单,自己写一个批量添加:
public void AddChildren (List<Transform> trans, Vector3 scale)
{
BetterList<Transform> list = GetChildList();
for(int i = 0; i < trans.Count; i++)
{
trans[i].name = i.ToString();
list.Add(trans[i]);
}
ResetPosition(list, scale);
}
当你解决以上两个问题之后,你会发现性能大幅提升,但随之会有一个问题,这个问题倒不是UIGrid特有的,而是NGUI的老毛病。
当你在同一帧修改控件的父亲时,控制的UIPanel会变成第一个父亲的panel.这其实并不是我们想要的。因为会引起绘制的不正确。
例如gird里面,明明clip的却不显示,反而在clip外面的显示。整个显示都错乱了。你只要注意复用gird的时候,不要将物体移到其他panel下面。
否则你只能自己手动修复panel了。
这样之后,从1s左右的时间缩短到了300ms左右,非常不错。