From 0845316a6c7de188434fa5376b338c4901134c07 Mon Sep 17 00:00:00 2001 From: Lior Tal Date: Wed, 14 Oct 2015 15:04:09 +0000 Subject: [PATCH 1/2] Improve memory behaviour by pre-allocating the right amount of memory. --HG-- branch : liortal/improve-memory-behaviour-by-preallocatin-1444835033293 --- Scripts/NicerOutline.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Scripts/NicerOutline.cs b/Scripts/NicerOutline.cs index 797d69f..bb0c68c 100644 --- a/Scripts/NicerOutline.cs +++ b/Scripts/NicerOutline.cs @@ -8,6 +8,9 @@ namespace UnityEngine.UI.Extensions [AddComponentMenu("UI/Effects/Extensions/Nicer Outline")] public class NicerOutline : BaseMeshEffect { + // A constant factor used when allocating the vertex list. + private const int GROWTH_FACTOR = 24; + [SerializeField] private Color m_EffectColor = new Color (0f, 0f, 0f, 0.5f); @@ -128,7 +131,7 @@ namespace UnityEngine.UI.Extensions { return; } - List < UIVertex > verts = new List(); + List < UIVertex > verts = new List(GROWTH_FACTOR * mesh.vertices.Length); using (var helper = new VertexHelper(mesh)) { helper.GetUIVertexStream(verts); From 6cba848e43668dfbd199ac60beaa67d9513801be Mon Sep 17 00:00:00 2001 From: Lior Tal Date: Thu, 15 Oct 2015 06:53:35 +0000 Subject: [PATCH 2/2] Fix the previous commit for improving memory consumption. Allocate the list with the correct capacity ahead, and avoid any needs for increasing the capacity when applying the shadow later. --HG-- branch : liortal/improve-memory-behaviour-by-preallocatin-1444835033293 --- Scripts/NicerOutline.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Scripts/NicerOutline.cs b/Scripts/NicerOutline.cs index bb0c68c..b284765 100644 --- a/Scripts/NicerOutline.cs +++ b/Scripts/NicerOutline.cs @@ -8,8 +8,7 @@ namespace UnityEngine.UI.Extensions [AddComponentMenu("UI/Effects/Extensions/Nicer Outline")] public class NicerOutline : BaseMeshEffect { - // A constant factor used when allocating the vertex list. - private const int GROWTH_FACTOR = 24; + private const int VERTICES_PER_QUAD = 6; [SerializeField] private Color m_EffectColor = new Color (0f, 0f, 0f, 0.5f); @@ -94,10 +93,6 @@ namespace UnityEngine.UI.Extensions { UIVertex vt; - var neededCpacity = verts.Count * 2; - if (verts.Capacity < neededCpacity) - verts.Capacity = neededCpacity; - for (int i = start; i < end; ++i) { vt = verts[i]; @@ -117,10 +112,6 @@ namespace UnityEngine.UI.Extensions protected void ApplyShadow(List verts, Color32 color, int start, int end, float x, float y) { - var neededCpacity = verts.Count * 2; - if (verts.Capacity < neededCpacity) - verts.Capacity = neededCpacity; - ApplyShadowZeroAlloc(verts, color, start, end, x, y); } @@ -131,8 +122,12 @@ namespace UnityEngine.UI.Extensions { return; } - List < UIVertex > verts = new List(GROWTH_FACTOR * mesh.vertices.Length); - using (var helper = new VertexHelper(mesh)) + + // Initilize a list with the correct capacity, to avoid unneeded allocations later. + // The list will hold 9 copies of the vertex data (original + 8 copies). + List < UIVertex > verts = new List(9 * (mesh.vertices.Length / 4 * VERTICES_PER_QUAD)); + + using (var helper = new VertexHelper(mesh)) { helper.GetUIVertexStream(verts); }