示例#1
0
 public static void CreateObject(PackageItem item, UIPackage.CreateObjectCallback callback)
 {
     Timers.inst.StartCoroutine(_CreateObject(item, callback));
 }
示例#2
0
 private static void CreateGObjectAsync(UIPackage.CreateObjectCallback result)
 {
     UIPackage.CreateObjectAsync(UIPackageName, UIResName, result);
 }
示例#3
0
        static IEnumerator _CreateObject(PackageItem item, UIPackage.CreateObjectCallback callback)
        {
            Stats.LatestObjectCreation   = 0;
            Stats.LatestGraphicsCreation = 0;

            float frameTime = UIConfig.frameTimeForAsyncUIConstruction;

            List <DisplayListItem> itemList = new List <DisplayListItem>();
            DisplayListItem        di       = new DisplayListItem(item, ObjectType.Component);

            di.childCount = CollectComponentChildren(item, itemList);
            itemList.Add(di);

            int            cnt        = itemList.Count;
            List <GObject> objectPool = new List <GObject>(cnt);
            GObject        obj;
            float          t = Time.realtimeSinceStartup;
            bool           alreadyNextFrame = false;

            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);

                    UIPackage._constructing++;
                    if (di.packageItem.type == PackageItemType.Component)
                    {
                        int poolStart = objectPool.Count - di.childCount - 1;

                        ((GComponent)obj).ConstructFromResource(objectPool, poolStart);

                        objectPool.RemoveRange(poolStart, di.childCount);
                    }
                    else
                    {
                        obj.ConstructFromResource();
                    }
                    UIPackage._constructing--;
                }
                else
                {
                    obj = UIObjectFactory.NewObject(di.type);
                    objectPool.Add(obj);

                    if (di.type == ObjectType.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;
                    alreadyNextFrame = true;
                }
            }

            if (!alreadyNextFrame) //强制至至少下一帧才调用callback,避免调用者逻辑出错
            {
                yield return(null);
            }

            callback(objectPool[0]);
        }