public static void CreateObject(PackageItem item, UIPackage.CreateObjectCallback callback) { Timers.inst.StartCoroutine(_CreateObject(item, callback)); }
private static void CreateGObjectAsync(UIPackage.CreateObjectCallback result) { UIPackage.CreateObjectAsync(UIPackageName, UIResName, result); }
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]); }