/// <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); } }
/// <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(); } }
/// <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); }
private static void OnLowMemoryCallBack() { Debug.LogWarning("低内存警告!!!"); if (Application.platform != RuntimePlatform.Android) { FreeMemory(); AssetsUnloadHandler.UnloadAll(); } }
static void Update() { //内存管理 MonitorMemorySize(); #if UNITY_EDITOR if (Input.GetKeyDown(KeyCode.F12)) { FreeMemory(); AssetsUnloadHandler.UnloadAll(); } #endif }
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); }
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"); }
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); }