Ejemplo n.º 1
0
 /// <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]);
      * }
      */
 }
Ejemplo n.º 2
0
    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);
    }