179 lines
3.9 KiB
C#
179 lines
3.9 KiB
C#
/*
|
||
********************************************************************************
|
||
*Copyright(C),coolae.net
|
||
*Author: chenbin
|
||
*Version: 2.0
|
||
*Date: 2017-01-09
|
||
*Description: 管理assetsBundle的加载释放
|
||
*Others:
|
||
*History:
|
||
*********************************************************************************
|
||
*/
|
||
|
||
using UnityEngine;
|
||
using System.Collections;
|
||
|
||
namespace Coolape
|
||
{
|
||
public class CLAssetsManager : MonoBehaviour
|
||
{
|
||
public static CLAssetsManager self;
|
||
public bool isPuase = false;
|
||
// 暂停释放资源(比如战斗中,先不释放)
|
||
|
||
#if UNITY_EDITOR
|
||
public string debugKey = "";
|
||
#endif
|
||
|
||
public CLAssetsManager ()
|
||
{
|
||
self = this;
|
||
}
|
||
|
||
//未使用超过x时间就释放该资源(秒)
|
||
public int timeOutSec4Realse = 300;
|
||
|
||
public static int realseTime {
|
||
get {
|
||
return self.timeOutSec4Realse;
|
||
}
|
||
set {
|
||
self.timeOutSec4Realse = value;
|
||
}
|
||
}
|
||
|
||
public Hashtable assetsMap = System.Collections.Hashtable.Synchronized (new Hashtable ());
|
||
|
||
public class AssetsInfor
|
||
{
|
||
public string key;
|
||
public string name;
|
||
public long lastUsedTime;
|
||
public int usedCount;
|
||
public AssetBundle asset;
|
||
public Callback doRealse;
|
||
}
|
||
|
||
public void pause ()
|
||
{
|
||
isPuase = true;
|
||
}
|
||
|
||
public void regain ()
|
||
{
|
||
isPuase = false;
|
||
}
|
||
|
||
public void addAsset (string key, string name, AssetBundle asset, Callback onRealse)
|
||
{
|
||
AssetsInfor ai = new AssetsInfor ();
|
||
ai.name = name;
|
||
ai.lastUsedTime = System.DateTime.Now.ToFileTime ();
|
||
ai.usedCount = 0;
|
||
ai.asset = asset;
|
||
ai.doRealse = onRealse;
|
||
ai.key = key;
|
||
assetsMap [key] = ai;
|
||
}
|
||
|
||
public void useAsset (string key)
|
||
{
|
||
AssetsInfor ai = (AssetsInfor)(assetsMap [key]);
|
||
if (ai != null) {
|
||
ai.usedCount++;
|
||
ai.lastUsedTime = System.DateTime.Now.ToFileTime ();
|
||
assetsMap [key] = ai;
|
||
|
||
#if UNITY_EDITOR
|
||
if (!string.IsNullOrEmpty(debugKey) && key.Contains(debugKey))
|
||
Debug.LogWarning (ai.usedCount + "====useAsset===" + key);
|
||
#endif
|
||
}
|
||
}
|
||
|
||
public void unUseAsset (string key)
|
||
{
|
||
AssetsInfor ai = (AssetsInfor)(assetsMap [key]);
|
||
if (ai != null) {
|
||
ai.usedCount--;
|
||
if (ai.usedCount < 0) {
|
||
Debug.LogError ("["+ai.key+"] is use time less then zero!!");
|
||
ai.usedCount = 0;
|
||
}
|
||
ai.lastUsedTime = System.DateTime.Now.ToFileTime ();
|
||
assetsMap [key] = ai;
|
||
|
||
#if UNITY_EDITOR
|
||
if (!string.IsNullOrEmpty(debugKey) && key.Contains(debugKey))
|
||
Debug.LogWarning (ai.usedCount + "===unUseAsset====" + key);
|
||
#endif
|
||
}
|
||
}
|
||
|
||
public object getAsset (string key)
|
||
{
|
||
AssetsInfor ai = (AssetsInfor)(assetsMap [key]);
|
||
if (ai != null) {
|
||
return ai.asset;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
void Start ()
|
||
{
|
||
InvokeRepeating ("releaseAsset", 10, 6);
|
||
}
|
||
|
||
void OnDestroy ()
|
||
{
|
||
CancelInvoke ();
|
||
}
|
||
|
||
public void releaseAsset ()
|
||
{
|
||
releaseAsset (false);
|
||
}
|
||
|
||
public void releaseAsset (bool isForceRelease)
|
||
{
|
||
try {
|
||
if (isPuase && !isForceRelease) {
|
||
return;
|
||
}
|
||
AssetsInfor ai = null;
|
||
ArrayList list = new ArrayList ();
|
||
list.AddRange (assetsMap.Values);
|
||
bool isHadRealseAssets = false;
|
||
for (int i = 0; i < list.Count; i++) {
|
||
ai = (AssetsInfor)(list [i]);
|
||
if (ai == null) {
|
||
continue;
|
||
}
|
||
if (ai.usedCount <= 0 &&
|
||
((System.DateTime.Now.ToFileTime () - ai.lastUsedTime) / 10000000 > realseTime || isForceRelease)) {
|
||
if (ai.doRealse != null) {
|
||
ai.doRealse (ai.name);
|
||
}
|
||
assetsMap.Remove (ai.key);
|
||
if (ai.asset != null) {
|
||
ai.asset.Unload (true);
|
||
ai.asset = null;
|
||
}
|
||
ai = null;
|
||
isHadRealseAssets = true;
|
||
}
|
||
}
|
||
// UnityEngine.Resources.UnloadUnusedAssets();
|
||
list.Clear ();
|
||
list = null;
|
||
|
||
if (isHadRealseAssets) {
|
||
//这种情况是处理当图片已经destory了,材质球却未来得及destory的情况
|
||
releaseAsset(isForceRelease);
|
||
}
|
||
} catch (System.Exception e) {
|
||
Debug.LogError (e);
|
||
}
|
||
}
|
||
}
|
||
} |