From e66f1bc75ec1221c77724a45d89826c7091f92be Mon Sep 17 00:00:00 2001 From: mob-sakai Date: Sun, 16 Dec 2018 20:43:15 +0900 Subject: [PATCH] close #11; Render the soft mask buffer only when needed to improve performance --- Scripts/SoftMask.cs | 61 +++++++++++++++++++++++++++++++++++++---- Scripts/SoftMaskable.cs | 2 +- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/Scripts/SoftMask.cs b/Scripts/SoftMask.cs index dc75177..60a6726 100644 --- a/Scripts/SoftMask.cs +++ b/Scripts/SoftMask.cs @@ -129,7 +129,29 @@ namespace Coffee.UIExtensions ReleaseRT(ref _softMaskBuffer); } - return _softMaskBuffer ? _softMaskBuffer : _softMaskBuffer = RenderTexture.GetTemporary(w, h, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default); + if(!_softMaskBuffer) + { + _softMaskBuffer = RenderTexture.GetTemporary (w, h, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default); + hasChanged = true; + } + + return _softMaskBuffer; + } + } + + public bool hasChanged + { + get + { + return _parent ? _parent.hasChanged : _hasChanged; + } + private set + { + if(_parent) + { + _parent.hasChanged = value; + } + _hasChanged = value; } } @@ -140,6 +162,7 @@ namespace Coffee.UIExtensions /// Configured Material. public override Material GetModifiedMaterial(Material baseMaterial) { + hasChanged = true; var result = base.GetModifiedMaterial(baseMaterial); if (m_IgnoreParent && result != baseMaterial) { @@ -154,6 +177,7 @@ namespace Coffee.UIExtensions /// void IMeshModifier.ModifyMesh(Mesh mesh) { + hasChanged = true; _mesh = mesh; } @@ -166,6 +190,7 @@ namespace Coffee.UIExtensions { verts.FillMesh(mesh); } + hasChanged = true; } /// @@ -212,6 +237,8 @@ namespace Coffee.UIExtensions /// protected override void OnEnable() { + hasChanged = true; + // Register. if (s_ActiveSoftMasks.Count == 0) { @@ -284,6 +311,7 @@ namespace Coffee.UIExtensions /// protected override void OnTransformParentChanged() { + hasChanged = true; SoftMask newParent = null; if (isActiveAndEnabled && !m_IgnoreParent) { @@ -295,9 +323,15 @@ namespace Coffee.UIExtensions } } SetParent(newParent); + hasChanged = true; } - #if UNITY_EDITOR + protected override void OnRectTransformDimensionsChange () + { + hasChanged = true; + } + +#if UNITY_EDITOR /// /// This function is called when the script is loaded or a value is changed in the inspector (Called in the editor only). /// @@ -328,6 +362,7 @@ namespace Coffee.UIExtensions Mesh _mesh; SoftMask _parent; List _children = new List(); + bool _hasChanged = false; Material material { get { return _material ? _material : _material = new Material(s_SoftMaskShader ? s_SoftMaskShader : s_SoftMaskShader = Resources.Load("SoftMask")){ hideFlags = HideFlags.HideAndDontSave }; } } @@ -340,7 +375,24 @@ namespace Coffee.UIExtensions { foreach (var sm in s_ActiveSoftMasks) { - if(sm) + if (!sm || sm._hasChanged) + continue; + + var rt = sm.rectTransform; + if(rt.hasChanged) + { + rt.hasChanged = false; + sm.hasChanged = true; + } + } + + foreach (var sm in s_ActiveSoftMasks) + { + if (!sm || !sm._hasChanged) + continue; + + sm._hasChanged = false; + if (!sm._parent) { sm.UpdateMaskTexture (); } @@ -352,9 +404,6 @@ namespace Coffee.UIExtensions /// void UpdateMaskTexture() { - if (_parent) - return; - Transform stopAfter = MaskUtilities.FindRootSortOverrideCanvas(transform); _stencilDepth = MaskUtilities.GetStencilDepth(transform, stopAfter); diff --git a/Scripts/SoftMaskable.cs b/Scripts/SoftMaskable.cs index a01f053..9021e07 100644 --- a/Scripts/SoftMaskable.cs +++ b/Scripts/SoftMaskable.cs @@ -44,7 +44,7 @@ namespace Coffee.UIExtensions } // Find the nearest parent softmask. - var parentTransform = transform; + var parentTransform = transform.parent; while (parentTransform) { var sm = parentTransform.GetComponent();