From 46c6bc321108cff294caed08515e1c8ebde99e90 Mon Sep 17 00:00:00 2001 From: pharan Date: Thu, 20 Jul 2017 14:29:56 +0800 Subject: [PATCH] [unity] Repacking now caches texture clones. This improves multiple subsequent repacking performance, but requires calling SpriteAtlasRegionExtensions.ClearCache to clean up. --- .../AttachmentTools/AttachmentTools.cs | 44 +++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/spine-unity/Assets/spine-unity/Modules/AttachmentTools/AttachmentTools.cs b/spine-unity/Assets/spine-unity/Modules/AttachmentTools/AttachmentTools.cs index 466059fdb..163e1ba52 100644 --- a/spine-unity/Assets/spine-unity/Modules/AttachmentTools/AttachmentTools.cs +++ b/spine-unity/Assets/spine-unity/Modules/AttachmentTools/AttachmentTools.cs @@ -469,9 +469,9 @@ namespace Spine.Unity.Modules.AttachmentTools { a.SetRegion(repackedRegions[regionIndexes[i]]); } - // Clean up - foreach (var ttp in texturesToPack) - UnityEngine.Object.Destroy(ttp); +// // Clean up +// foreach (var ttp in texturesToPack) +// UnityEngine.Object.Destroy(ttp); t = newTexture; m = newMaterial; @@ -482,20 +482,38 @@ namespace Spine.Unity.Modules.AttachmentTools { return Sprite.Create(ar.GetMainTexture(), ar.GetUnityRect(), new Vector2(0.5f, 0.5f), pixelsPerUnit); } + static Dictionary CachedRegionTextures = new Dictionary(); + static List CachedRegionTexturesList = new List(); + + public static void ClearCache () { + foreach (var t in CachedRegionTexturesList) { + UnityEngine.Object.Destroy(t); + } + CachedRegionTextures.Clear(); + CachedRegionTexturesList.Clear(); + } + /// Creates a new Texture2D object based on an AtlasRegion. /// If applyImmediately is true, Texture2D.Apply is called immediately after the Texture2D is filled with data. public static Texture2D ToTexture (this AtlasRegion ar, bool applyImmediately = true, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps) { - Texture2D sourceTexture = ar.GetMainTexture(); - Rect r = ar.GetUnityRect(sourceTexture.height); - int width = (int)r.width; - int height = (int)r.height; - Texture2D output = new Texture2D(width, height, textureFormat, mipmaps); - output.name = ar.name; - Color[] pixelBuffer = sourceTexture.GetPixels((int)r.x, (int)r.y, width, height); - output.SetPixels(pixelBuffer); + Texture2D output; - if (applyImmediately) - output.Apply(); + CachedRegionTextures.TryGetValue(ar, out output); + if (output == null) { + Texture2D sourceTexture = ar.GetMainTexture(); + Rect r = ar.GetUnityRect(sourceTexture.height); + int width = (int)r.width; + int height = (int)r.height; + output = new Texture2D(width, height, textureFormat, mipmaps); + output.name = ar.name; + Color[] pixelBuffer = sourceTexture.GetPixels((int)r.x, (int)r.y, width, height); + output.SetPixels(pixelBuffer); + CachedRegionTextures.Add(ar, output); + CachedRegionTexturesList.Add(output); + + if (applyImmediately) + output.Apply(); + } return output; }