IEnumerator _CreateObjectAsync(PackageItem item, CreateObjectCallback callback)
{
Stats.LatestObjectCreation = 0;
Stats.LatestGraphicsCreation = 0;
float frameTime = UIConfig.frameTimeForAsyncUIConstruction;
List<DisplayListItem> itemList = new List<DisplayListItem>();
CollectComponentChildren(item, itemList);
itemList.Add(new DisplayListItem(item, null));
int cnt = itemList.Count;
List<GObject> objectPool = new List<GObject>(cnt);
GObject obj;
DisplayListItem di;
float t = Time.realtimeSinceStartup;
for (int i = 0; i < cnt; i++)
{
di = itemList[i];
if (di.packageItem != null)
{
obj = UIObjectFactory.NewObject(di.packageItem);
obj.packageItem = di.packageItem;
objectPool.Add(obj);
_constructing++;
if (di.packageItem.type == PackageItemType.Component)
{
int poolStart = objectPool.Count - di.packageItem.displayList.Length - 1;
((GComponent)obj).ConstructFromResource(objectPool, poolStart);
objectPool.RemoveRange(poolStart, di.packageItem.displayList.Length);
}
else
{
GetItemAsset(di.packageItem);
obj.ConstructFromResource();
}
_constructing--;
}
else
{
obj = UIObjectFactory.NewObject(di.type);
objectPool.Add(obj);
if (di.type == "list" && di.listItemCount > 0)
{
int poolStart = objectPool.Count - di.listItemCount - 1;
for (int k = 0; k < di.listItemCount; k++) //把他们都放到pool里,这样GList在创建时就不需要创建对象了
((GList)obj).itemPool.ReturnObject(objectPool[k + poolStart]);
objectPool.RemoveRange(poolStart, di.listItemCount);
}
}
if ((i % 5 == 0) && Time.realtimeSinceStartup - t >= frameTime)
{
yield return null;
t = Time.realtimeSinceStartup;
}
}
callback(objectPool[0]);
}