有的时候加载一个UI界面时可能需要加载很多的子UI,比如商店界面,如果在第一次进入时才实例化那么多个道具UI可能会给客户端带来不小的负担。其中一种优化的办法是预加载和分帧加载。
//外部调用的预加载方法
public void preloadCell()
{
StartCoroutine("preLoadExpItemCell");
}
//道具数据
class Item
{
public GameObject obj; //UI预制体
public ItemType itemType; //道具类型
public int id; //道具ID
public int name; //道具名字
}
List<Item> expItems = new List<Item>();
/// <summary>
/// 预加载经验道具UI
/// </summary>
/// <returns></returns>
IEnumerator preLoadExpItemCell()
{
// 获得所有经验道具的数据
List<Item> allExpItems = ItemManager.getAllItemsByType(ItemType.exp);
//每帧实例化一个道具UI
for (int index = 0; index < allExpItems.Count; index++)
{
Instantiate(allExpItems[index].obj);
expItems.Add(allExpItems[index]);
yield return new WaitForSecondsRealtime(0.02f);
}
}
核心思路就是“我知道我卡,但我就是要拖住”。在合适的时机开始预加载道具UI,并且每帧加载一定个数的UI,达到即使在加载UI玩家也感受不到的效果。
拿商店来举例子,如果在实际体验中这个商店在进入游戏后不久大概率会被打开的话,那么在游戏开始就应该进行预加载了,这里1帧只加载1个经验道具UI是因为等玩家进入经验道具标签页时已经全部加载完了,那么就尽量压缩预加载的数量来减小客户端压力,要根据实际体验进行数值选择。