/// <summary> /// 通过传入一个UIWindow来尝试卸载该界面引用的图集内存 /// 如果没有其他界面引用则可以成功卸载 /// </summary> /// <param name="window">UIEnforceWindow类型</param> private void TryUnloadAtlas(UIEnforceWindow window) { /* * List<string> atlasNeedUnload = new List<string>(); * int usedCount; * * for (int i = 0; i < window.usedAtlas.Count; i++) * { * usedCount = 0; * for (int j = 0; j < windowPool.Count; j++) * { * for (int k = 0; k < windowPool[j].usedAtlas.Count; k++) * { * if (window.usedAtlas[i].Equals(windowPool[j].usedAtlas[k])) * usedCount++; * } * * } * * for (int j = 0; j < enforceWindowPool.Count; j++) * { * for (int k = 0; k < windowPool[j].usedAtlas.Count; k++) * { * if (window.usedAtlas[i].Equals(windowPool[j].usedAtlas[k])) * usedCount++; * } * * } * if (usedCount == 0) * AtlasManager.Instance.UnloadAtlas(window.usedAtlas[i]); * } */ }
private GameObject GetEnforceWindow(UIEnforceWindows windowKey, object args) { if (_enforceWindowPool == null) { _enforceWindowPool = new List <UIEnforceWindow>(); } UIEnforceWindow requesetWindow = null; // 如果缓存池中有,则直接加载 for (var i = 0; i < _enforceWindowPool.Count; i++) { if (_enforceWindowPool[i].windowKey == windowKey) { requesetWindow = _enforceWindowPool[i]; requesetWindow.lastOpenTime = DateTime.Now; break; } } if (requesetWindow != null) { SetVisible(requesetWindow.gameObject, true); requesetWindow.Set(args); } else { // 如果缓存池中没有,则从硬盘加载 var windowName = Enum.GetName(typeof(UIEnforceWindows), windowKey); var resourcePath = UIEnforcewindowDir; var resourceName = resourcePath + windowName; // requesetWindow = GameObject.Instantiate(ResourceLoader.GetObjectDirectly<GameObject>(resourceName)).GetComponent<UIEnforceWindow>(); requesetWindow = (Instantiate(Resources.Load(resourceName, typeof(GameObject))) as GameObject) .GetComponent <UIEnforceWindow>(); // windowObj.window = GameObject.Instantiate(ResourceLoader.GetObjectDirectly<UnityEngine.Object>(resourceName)) as GameObject; requesetWindow.transform.SetParent(UIRoot.transform); // 设置camera var canvases = requesetWindow.transform.GetComponentsInChildren <Canvas>(); for (var i = 0; i < canvases.Length; i++) { canvases[i].worldCamera = UICamera; } var rect = requesetWindow.GetComponent <RectTransform>(); rect.pivot = new Vector2(0.5f, 0.5f); rect.localPosition = Vector3.zero; rect.localScale = Vector3.one; rect.sizeDelta = Vector2.zero; requesetWindow.Init(args); requesetWindow.lastOpenTime = DateTime.Now; _enforceWindowPool.Add(requesetWindow); // 如果超出缓存容量,删除最早打开的window if (_enforceWindowPool.Count > _poolCapacity) { var forDestroyWindow = _enforceWindowPool[0]; for (var i = 1; i < _enforceWindowPool.Count; i++) { if (_enforceWindowPool[i].lastOpenTime < forDestroyWindow.lastOpenTime) { forDestroyWindow = _enforceWindowPool[i]; } } LogManager.Log("Remove Window:" + forDestroyWindow.gameObject.name); _enforceWindowPool.Remove(forDestroyWindow); TryUnloadAtlas(forDestroyWindow); Destroy(forDestroyWindow.gameObject); } } return(requesetWindow.gameObject); }