public void Release(T element) { m_LastUsingTime = MDebug.GetMillisecondsSinceStartup(); #if GF_DEBUG MDebug.Assert(element != null, "Pool", $"element == null"); bool removedFromUsing = false; for (int iObject = 0; iObject < m_Using.Count; iObject++) { UsingObject usingObject = m_Using[iObject]; if (usingObject.Obj.Equals(element)) { removedFromUsing = true; m_Using.RemoveAt(iObject); break; } } if (!removedFromUsing) { MDebug.LogError("Pool" , $"Object({element.ToString()}) not alloc by ObjectPool<{typeof(T).FullName}>!"); } #endif element.OnRelease(); m_Stack.Push(element); m_UsingCount--; }
public void CheckMemoryLeak() { long currentTime = MDebug.GetMillisecondsSinceStartup(); for (int iObject = 0; iObject < m_Using.Count; iObject++) { UsingObject usingObject = m_Using[iObject]; if (currentTime - usingObject.WhenBeUse > m_MemoryLeakMilliseconds) { MDebug.LogWarning("Pool" , $"Object in ObjectPool<{typeof(T).FullName}> be used {(currentTime - usingObject.WhenBeUse) * 0.001:F2} seconds ago, maybe memory leak!\n({usingObject.ToString()})"); } } }
public override string ToString() { System.Text.StringBuilder stringBuilder = StringUtility.AllocStringBuilder(); stringBuilder.Append($"ObjectPool<{typeof(T).FullName}> alloc {m_AllCount} objects. ") .Append($"{m_UsingCount} obejcts being used"); #if GF_DEBUG long currentTime = MDebug.GetMillisecondsSinceStartup(); for (int iObject = 0; iObject < m_Using.Count; iObject++) { UsingObject usingObject = m_Using[iObject]; float beUsedTime = (currentTime - usingObject.WhenBeUse) * 0.001f; stringBuilder.Append($"\nObject be used {beUsedTime:F2} seconds. ({usingObject.ToString()})"); } #endif return(StringUtility.ReleaseStringBuilder(stringBuilder)); }