Skip to content

Commit

Permalink
refactor: update coffee.internal
Browse files Browse the repository at this point in the history
  • Loading branch information
mob-sakai committed Dec 22, 2024
1 parent 934f4b8 commit aa56116
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ internal static class ComponentExtensions
public static T[] GetComponentsInChildren<T>(this Component self, int depth)
where T : Component
{
var results = ListPool<T>.Rent();
var results = InternalListPool<T>.Rent();
self.GetComponentsInChildren_Internal(results, depth);
var array = results.ToArray();
ListPool<T>.Return(ref results);
InternalListPool<T>.Return(ref results);
return array;
}

Expand Down
5 changes: 3 additions & 2 deletions Packages/src/Runtime/Internal/Utilities/FastAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ namespace Coffee.UIParticleInternal
/// </summary>
internal class FastActionBase<T>
{
private static readonly ObjectPool<LinkedListNode<T>> s_NodePool =
new ObjectPool<LinkedListNode<T>>(() => new LinkedListNode<T>(default), _ => true, x => x.Value = default);
private static readonly InternalObjectPool<LinkedListNode<T>> s_NodePool =
new InternalObjectPool<LinkedListNode<T>>(() => new LinkedListNode<T>(default), _ => true,
x => x.Value = default);

private readonly LinkedList<T> _delegates = new LinkedList<T>();

Expand Down
17 changes: 17 additions & 0 deletions Packages/src/Runtime/Internal/Utilities/Misc.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
using System;
using System.Diagnostics;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
#if UNITY_EDITOR && UNITY_2021_2_OR_NEWER
using UnityEditor.SceneManagement;
#elif UNITY_EDITOR
using UnityEditor.Experimental.SceneManagement;
#endif

namespace Coffee.UIParticleInternal
{
Expand Down Expand Up @@ -53,5 +60,15 @@ public static void SetDirty(Object obj)
EditorUtility.SetDirty(obj);
#endif
}

#if UNITY_EDITOR
public static T[] GetAllComponentsInPrefabStage<T>() where T : Component
{
var prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
if (prefabStage == null) return Array.Empty<T>();

return prefabStage.prefabContentsRoot.GetComponentsInChildren<T>(true);
}
#endif
}
}
75 changes: 70 additions & 5 deletions Packages/src/Runtime/Internal/Utilities/ObjectPool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,58 @@ namespace Coffee.UIParticleInternal
/// <summary>
/// Object pool.
/// </summary>
internal class ObjectPool<T>
internal class InternalObjectPool<T> where T : class
{
#if UNITY_2021_1_OR_NEWER
private readonly Predicate<T> _onValid; // Delegate for checking if instances are valid
private readonly UnityEngine.Pool.ObjectPool<T> _pool;

public InternalObjectPool(Func<T> onCreate, Predicate<T> onValid, Action<T> onReturn)
{
_pool = new UnityEngine.Pool.ObjectPool<T>(onCreate, null, onReturn);
_onValid = onValid;
}

/// <summary>
/// Rent an instance from the pool.
/// When you no longer need it, return it with <see cref="Return" />.
/// </summary>
public T Rent()
{
while (0 < _pool.CountInactive)
{
var instance = _pool.Get();
if (_onValid(instance))
{
return instance;
}
}

// If there are no instances in the pool, create a new one.
Logging.Log(this, $"A new instance is created (pooled: {_pool.CountInactive}, created: {_pool.CountAll}).");
return _pool.Get();
}

/// <summary>
/// Return an instance to the pool and assign null.
/// Be sure to return the instance obtained with <see cref="Rent" /> with this method.
/// </summary>
public void Return(ref T instance)
{
if (instance == null) return; // Ignore if already pooled or null.

_pool.Release(instance);
Logging.Log(this, $"An instance is released (pooled: {_pool.CountInactive}, created: {_pool.CountAll}).");
instance = default; // Set the reference to null.
}
#else
private readonly Func<T> _onCreate; // Delegate for creating instances
private readonly Action<T> _onReturn; // Delegate for returning instances to the pool
private readonly Predicate<T> _onValid; // Delegate for checking if instances are valid
private readonly Stack<T> _pool = new Stack<T>(32); // Object pool
private int _count; // Total count of created instances

public ObjectPool(Func<T> onCreate, Predicate<T> onValid, Action<T> onReturn)
public InternalObjectPool(Func<T> onCreate, Predicate<T> onValid, Action<T> onReturn)
{
_onCreate = onCreate;
_onValid = onValid;
Expand Down Expand Up @@ -54,15 +97,36 @@ public void Return(ref T instance)
Logging.Log(this, $"An instance is released (pooled: {_pool.Count}, created: {_count}).");
instance = default; // Set the reference to null.
}
#endif
}

/// <summary>
/// Object pool for <see cref="List{T}" />.
/// </summary>
internal static class ListPool<T>
internal static class InternalListPool<T>
{
private static readonly ObjectPool<List<T>> s_ListPool =
new ObjectPool<List<T>>(() => new List<T>(), _ => true, x => x.Clear());
#if UNITY_2021_1_OR_NEWER
/// <summary>
/// Rent an instance from the pool.
/// When you no longer need it, return it with <see cref="Return" />.
/// </summary>
public static List<T> Rent()
{
return UnityEngine.Pool.ListPool<T>.Get();
}

/// <summary>
/// Return an instance to the pool and assign null.
/// Be sure to return the instance obtained with <see cref="Rent" /> with this method.
/// </summary>
public static void Return(ref List<T> toRelease)
{
UnityEngine.Pool.ListPool<T>.Release(toRelease);
toRelease = null;
}
#else
private static readonly InternalObjectPool<List<T>> s_ListPool =
new InternalObjectPool<List<T>>(() => new List<T>(), _ => true, x => x.Clear());

/// <summary>
/// Rent an instance from the pool.
Expand All @@ -81,5 +145,6 @@ public static void Return(ref List<T> toRelease)
{
s_ListPool.Return(ref toRelease);
}
#endif
}
}
8 changes: 4 additions & 4 deletions Packages/src/Runtime/UIParticleRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ public void UpdateMesh(Camera bakeCamera)
workerMesh.LinearToGamma();
}

var components = ListPool<Component>.Rent();
var components = InternalListPool<Component>.Rent();
GetComponents(typeof(IMeshModifier), components);
for (var i = 0; i < components.Count; i++)
{
Expand All @@ -430,7 +430,7 @@ public void UpdateMesh(Camera bakeCamera)
#pragma warning restore CS0618 // Type or member is obsolete
}

ListPool<Component>.Return(ref components);
InternalListPool<Component>.Return(ref components);
}

Profiler.EndSample();
Expand All @@ -442,7 +442,7 @@ public void UpdateMesh(Camera bakeCamera)

// Get grouped renderers.
Profiler.BeginSample("[UIParticleRenderer] Set Mesh");
var renderers = ListPool<UIParticleRenderer>.Rent();
var renderers = InternalListPool<UIParticleRenderer>.Rent();
if (_parent.useMeshSharing)
{
UIParticleUpdater.GetGroupedRenderers(_parent.groupId, _index, renderers);
Expand All @@ -459,7 +459,7 @@ public void UpdateMesh(Camera bakeCamera)
r.canvasRenderer.SetMaterial(materialForRendering, 0);
}

ListPool<UIParticleRenderer>.Return(ref renderers);
InternalListPool<UIParticleRenderer>.Return(ref renderers);

if (_parent.canRender)
{
Expand Down

0 comments on commit aa56116

Please sign in to comment.