public void ResetMaskParams(Material mat)
{
mat.SetFloat("_MinX", -1);
mat.SetFloat("_MinY", -1);
mat.SetFloat("_MaxX", 1);
mat.SetFloat("_MaxY", 1);
}
简单测试,真正使用用resid代替objPrefab,并用Assetbundle同步加载
public GameObject GetEffect(GameObject objPrefab)
{
string name = GetNoCloneName(objPrefab.name);
GameObject obj = null;
if (m_dicPool.ContainsKey(name))
{
if (m_dicPool[name] != null && m_dicPool[name].Count > 0)
{
obj = m_dicPool[name].Dequeue();
while (obj == null && m_dicPool[name].Count > 0)
{
obj = m_dicPool[name].Dequeue();
if (obj != null)
{
//return obj;
break;
}
}
if (obj == null)
{
obj = GameObject.Instantiate(objPrefab) as GameObject;
}
}
else
{
obj = GameObject.Instantiate(objPrefab) as GameObject;
}
}
else
{
m_dicPool[name] = new Queue<GameObject>(m_count);
obj = GameObject.Instantiate(objPrefab) as GameObject;
}
obj.SetActive(true);
SetInDicUse(obj);
return obj;
}
public void RecycleEffect(GameObject obj)
{
if (obj == null)
{
return;
}
//这里加要过滤不回收的粒子名字,或条件
string name = GetNoCloneName(obj.name);
m_lastUsedTime[name] = Time.time;
SetOutDicUse(obj);
obj.transform.SetParent(GetEffectPoolObj());
obj.SetActive(false);
if (m_dicPool.ContainsKey(name))
{
if (m_dicPool[name] == null)
{
m_dicPool[name] = new Queue<GameObject>(m_count);
}
m_dicPool[name].Enqueue(obj);
}
else
{
m_dicPool[name] = new Queue<GameObject>(m_count);
m_dicPool[name].Enqueue(obj);
}
}
private void FixedUpdate()
{
foreach (var item in m_lastUsedTime)
{
string keyName = item.Key;
float lastTime = item.Value;
if (m_dicUse.ContainsKey(keyName) && m_dicUse[keyName].Count == 0)
{
if (m_dicPool.ContainsKey(keyName))
{
if (m_dicPool[keyName].Count > 0)//某个池里还有空闲对象
{
if (Time.time - lastTime > GetDeleOneObjTimeClip(m_dicPool[keyName].Count)) // 超时移除一个空闲对象
{
GameObject idleObj = m_dicPool[keyName].Dequeue();
GameObject.Destroy(idleObj);
timeUpdateList.Add(keyName);
}
}
else//某个池里无空闲对象
{
if (Time.time - lastTime > mResReleaseTime)
{
releaseList.Add(keyName);
}
}
}
}
}
for (int i = 0; i < timeUpdateList.Count; i++)
{
m_lastUsedTime[timeUpdateList[i]] = Time.time; // 上次删除缓冲池里某个obj的时间
}
public void AddUnloadWeights(int nWeights = 1)
{
m_nSumWeights += nWeights;
}
void Update()
{
//每60帧执行一次检测
if (Time.frameCount % CHECK_INTERVAL_FRAME == 0)
{
TryUnloadUnusedAssets();
}
}
void TryUnloadUnusedAssets()
{
if ((Time.realtimeSinceStartup - m_fLastUnloadTime >= m_nMaxInterval)
|| (m_nSumWeights >= m_nWeightsThreshold))
{
DoUnloadUnusedAssets();
}
}
void DoUnloadUnusedAssets()
{
Resources.UnloadUnusedAssets();
System.GC.Collect();
m_nSumWeights = 0;
m_fLastUnloadTime = Time.realtimeSinceStartup;
}
https://github.com/luoyikun/UnityForTest EffectPoolMgr.cs