FairyGUI.UIPackage._CreateObjectAsync C# (CSharp) Method

_CreateObjectAsync() private method

private _CreateObjectAsync ( PackageItem item, CreateObjectCallback callback ) : IEnumerator
item PackageItem
callback CreateObjectCallback
return IEnumerator
        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]);
        }