Esempio n. 1
0
    /// <summary>
    /// 资源引用数减少(该资源的依赖也会减少)
    /// </summary>
    /// <param name="path"></param>
    public void DestoryAssetsCounter(string path)
    {
        if (assetsCaches.ContainsKey(path))
        {
            AssetsData assets = assetsCaches[path];
            assets.refCount--;
            if (assets.refCount < 0)
            {
                Debug.LogError("资源引用计数错误:(" + assets.refCount + ") " + assets.assetPath);
                assets.refCount = 0;
            }
            if (assets.refCount <= 0)
            {
                AssetsUnloadHandler.DiscardAssets(assets);
            }

            string[] dependenciesNames = loader.GetAllDependenciesName(path);
            //Debug.LogWarning("DestoryAssets:" + name + "=>" + string.Join("\n", dependenciesNames));
            foreach (var item in dependenciesNames)
            {
                DestoryAssetsCounter(item);
            }
        }
        else
        {
            Debug.LogError("未加载资源,不能Destroy :" + path);
        }
    }
Esempio n. 2
0
    /// <summary>
    /// 用于监控内存
    /// </summary>
    /// <param name="tag"></param>
    static void MonitorMemorySize()
    {
        if (ApplicationManager.AppMode != AppMode.Release)
        {
            totalReservedMemory  = ByteToM(Profiler.GetTotalReservedMemoryLong());
            totalAllocatedMemory = ByteToM(Profiler.GetTotalAllocatedMemoryLong());
        }

        if (tempTime <= 0)
        {
            tempTime = UpdateMemoryTime;
            if (MemoryInfo.GetMemoryInfo())
            {
                freeMemory = MemoryInfo.minf.memfree / 1024f / 1024f;
                allMemory  = MemoryInfo.minf.memtotal / 1024f / 1024f;
                usedMemory = MemoryInfo.minf.memused / 1024f / 1024f;
            }
        }
        else
        {
            tempTime -= Time.deltaTime;
        }

        AssetsUnloadHandler.LateUpdate();

        if (NeedReleaseMemory() && OpenAutoMemoryClean)
        {
            AssetsUnloadHandler.UnloadOne();
        }
    }
Esempio n. 3
0
    /// <summary>
    /// 异步加载资源逻辑
    /// </summary>
    /// <param name="path"></param>
    /// <param name="assetType"></param>
    /// <param name="callBack"></param>
    /// <returns></returns>
    private IEnumerator LoadAssetsIEnumerator(string path, Type assetType, CallBack <Object> callBack)
    {
        yield return(LoadAssetsIDependencieEnumerator(path));

        if (assetsCaches.ContainsKey(path))
        {
            AssetsData assets = assetsCaches[path];
            assets.refCount++;
            AssetsUnloadHandler.MarkUseAssets(assets, loader.IsHaveDependencies(path));
            if (callBack != null)
            {
                callBack(assets.Assets[0]);
            }
        }
        else
        {
            yield return(loader.LoadAssetsIEnumerator(path, assetType, (assets) =>
            {
                assetsCaches.Add(path, assets);

                assets.refCount++;
                AssetsUnloadHandler.MarkUseAssets(assets, loader.IsHaveDependencies(path));
                if (callBack != null)
                {
                    callBack(assets.Assets[0]);
                }
            }));
        }
        yield return(0);
    }
Esempio n. 4
0
 private static void OnLowMemoryCallBack()
 {
     Debug.LogWarning("低内存警告!!!");
     if (Application.platform != RuntimePlatform.Android)
     {
         FreeMemory();
         AssetsUnloadHandler.UnloadAll();
     }
 }
Esempio n. 5
0
    static void Update()
    {
        //内存管理
        MonitorMemorySize();

    #if UNITY_EDITOR
        if (Input.GetKeyDown(KeyCode.F12))
        {
            FreeMemory();
            AssetsUnloadHandler.UnloadAll();
        }
#endif
    }
Esempio n. 6
0
    public AssetsData LoadAssetsLogic(string path, CallBackR <bool> checkContainsAssets, CallBackR <AssetsData, string> loadMethod)
    {
        LoadAssetsDependencie(path);
        AssetsData assets = null;

        if (checkContainsAssets())
        {
            assets = assetsCaches[path];
        }
        else
        {
            assets = loadMethod(path);
            if (assets == null)
            {
                Debug.LogError("资源加载失败:" + path);
                return(assets);
            }
            else
            {
                if (assetsCaches.ContainsKey(path))
                {
                    List <Object> asList = new List <Object>(assetsCaches[path].Assets);
                    foreach (var item in assets.Assets)
                    {
                        if (!asList.Contains(item))
                        {
                            asList.Add(item);
                        }
                    }
                    assetsCaches[path].Assets = asList.ToArray();
                    assets = assetsCaches[path];
                }
                else
                {
                    if (useCache)
                    {
                        assetsCaches.Add(path, assets);
                    }
                }
            }
        }
        if (useCache)
        {
            assets.refCount++;
            AssetsUnloadHandler.MarkUseAssets(assets, loader.IsHaveDependencies(path));
        }
        return(assets);
    }
Esempio n. 7
0
    private void DrawLoadAssets()
    {
        long allSize = 0;

        foreach (var item in assetsCaches)
        {
            allSize += item.Value.GetTotalMemorySize();
        }
        GUILayout.BeginHorizontal();
        GUILayout.BeginVertical();
        GUILayout.Label("资源占用:" + (allSize / 1024f / 1024).ToString("F") + "MB");
        GUILayout.Space(4);
        EditorDrawGUIUtil.CanEdit = true;
        onlyShowNoRef             = (bool)EditorDrawGUIUtil.DrawBaseValue("是否只显示无引用资源", onlyShowNoRef);
        EditorDrawGUIUtil.CanEdit = false;
        GUILayout.EndVertical();
        GUILayout.BeginVertical();
        if (GUILayout.Button("清空对象池配置缓存"))
        {
            MemoryManager.FreeMemory();
        }
        if (GUILayout.Button("全部卸载(" + AssetsUnloadHandler.noUsedAssetsList.Count + ")"))
        {
            AssetsUnloadHandler.UnloadAll();
        }

        GUILayout.EndVertical();
        GUILayout.EndHorizontal();
        GUILayout.Space(4);
        EditorDrawGUIUtil.DrawScrollView(this, () =>
        {
            List <AssetsData> assetList = new List <AssetsData>(assetsCaches.Values);
            assetList.Sort((t0, t1) =>
            {
                if (t0.GetTotalMemorySize() > t1.GetTotalMemorySize())
                {
                    return(-1);
                }
                else if (t0.GetTotalMemorySize() < t1.GetTotalMemorySize())
                {
                    return(1);
                }

                return(0);
            });
            for (int i = 0; i < assetList.Count; i++)
            {
                AssetsData item = assetList[i];
                if (!string.IsNullOrEmpty(bundleSearchValue))
                {
                    if (!item.assetName.Contains(bundleSearchValue.ToLower()))
                    {
                        continue;
                    }
                }
                if (onlyShowNoRef && item.refCount > 0)
                {
                    continue;
                }
                DrawAssetsData(i, item);
            }
        }, "box");
    }
Esempio n. 8
0
    private static GameObject GetNewObject(bool isAlwaysNew, string objName, GameObject prefab, GameObject parent = null, bool isSetActive = true)
    {
        GameObject go   = null;
        string     name = objName;

        if (string.IsNullOrEmpty(name))
        {
            name = prefab.name;
        }

        if (!isAlwaysNew && IsExist(name))
        {
            if (!recyclePools.ContainsKey(name))
            {
                if (prefab != null)
                {
                    go = ObjectInstantiate(prefab, parent);
                }
                else
                {
                    go = NewGameObject(name, parent);
                }
            }
            else
            {
                objIDs.Clear();
                objIDs.AddRange(recyclePools[name].Keys);
                int id = objIDs[0];
                go = recyclePools[name][id];
                recyclePools[name].Remove(id);
                if (recyclePools[name].Count == 0)
                {
                    recyclePools.Remove(name);
                }
            }
        }
        else
        {
            if (prefab == null && !string.IsNullOrEmpty(objName))
            {
                go = NewGameObject(name, parent);
            }
            else if (prefab != null && string.IsNullOrEmpty(objName))
            {
                go = ObjectInstantiate(prefab, parent);
            }
        }
        if (go == null)
        {
            Debug.LogError("GameObjectManager 加载失败:" + name);
            return(go);
        }
        if (createPools.ContainsKey(name))
        {
            createPools[name].Add(go.GetInstanceID(), go);
        }
        else
        {
            createPools.Add(name, new  Dictionary <int, GameObject>()
            {
                { go.GetInstanceID(), go }
            });
        }
        AssetsUnloadHandler.MarkUseAssets(name);
        PoolObject po = go.GetComponent <PoolObject>();

        if (po)
        {
            try
            {
                po.OnFetch();
            }
            catch (Exception e)
            {
                Debug.LogError("GetNewObject Error: " + e.ToString());
            }
        }

        if (isSetActive)
        {
            go.SetActive(true);
        }

        if (parent == null)
        {
            go.transform.SetParent(null);
        }
        else
        {
            go.transform.SetParent(parent.transform);
        }
        return(go);
    }