close #11; Render the soft mask buffer only when needed to improve performance

pull/87/head
mob-sakai 2018-12-16 20:43:15 +09:00
parent 782289612b
commit e66f1bc75e
2 changed files with 56 additions and 7 deletions

View File

@ -129,7 +129,29 @@ namespace Coffee.UIExtensions
ReleaseRT(ref _softMaskBuffer); 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
/// <param name="baseMaterial">Configured Material.</param> /// <param name="baseMaterial">Configured Material.</param>
public override Material GetModifiedMaterial(Material baseMaterial) public override Material GetModifiedMaterial(Material baseMaterial)
{ {
hasChanged = true;
var result = base.GetModifiedMaterial(baseMaterial); var result = base.GetModifiedMaterial(baseMaterial);
if (m_IgnoreParent && result != baseMaterial) if (m_IgnoreParent && result != baseMaterial)
{ {
@ -154,6 +177,7 @@ namespace Coffee.UIExtensions
/// </summary> /// </summary>
void IMeshModifier.ModifyMesh(Mesh mesh) void IMeshModifier.ModifyMesh(Mesh mesh)
{ {
hasChanged = true;
_mesh = mesh; _mesh = mesh;
} }
@ -166,6 +190,7 @@ namespace Coffee.UIExtensions
{ {
verts.FillMesh(mesh); verts.FillMesh(mesh);
} }
hasChanged = true;
} }
/// <summary> /// <summary>
@ -212,6 +237,8 @@ namespace Coffee.UIExtensions
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
hasChanged = true;
// Register. // Register.
if (s_ActiveSoftMasks.Count == 0) if (s_ActiveSoftMasks.Count == 0)
{ {
@ -284,6 +311,7 @@ namespace Coffee.UIExtensions
/// </summary> /// </summary>
protected override void OnTransformParentChanged() protected override void OnTransformParentChanged()
{ {
hasChanged = true;
SoftMask newParent = null; SoftMask newParent = null;
if (isActiveAndEnabled && !m_IgnoreParent) if (isActiveAndEnabled && !m_IgnoreParent)
{ {
@ -295,6 +323,12 @@ namespace Coffee.UIExtensions
} }
} }
SetParent(newParent); SetParent(newParent);
hasChanged = true;
}
protected override void OnRectTransformDimensionsChange ()
{
hasChanged = true;
} }
#if UNITY_EDITOR #if UNITY_EDITOR
@ -328,6 +362,7 @@ namespace Coffee.UIExtensions
Mesh _mesh; Mesh _mesh;
SoftMask _parent; SoftMask _parent;
List<SoftMask> _children = new List<SoftMask>(); List<SoftMask> _children = new List<SoftMask>();
bool _hasChanged = false;
Material material { get { return _material ? _material : _material = new Material(s_SoftMaskShader ? s_SoftMaskShader : s_SoftMaskShader = Resources.Load<Shader>("SoftMask")){ hideFlags = HideFlags.HideAndDontSave }; } } Material material { get { return _material ? _material : _material = new Material(s_SoftMaskShader ? s_SoftMaskShader : s_SoftMaskShader = Resources.Load<Shader>("SoftMask")){ hideFlags = HideFlags.HideAndDontSave }; } }
@ -340,7 +375,24 @@ namespace Coffee.UIExtensions
{ {
foreach (var sm in s_ActiveSoftMasks) 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 (); sm.UpdateMaskTexture ();
} }
@ -352,9 +404,6 @@ namespace Coffee.UIExtensions
/// </summary> /// </summary>
void UpdateMaskTexture() void UpdateMaskTexture()
{ {
if (_parent)
return;
Transform stopAfter = MaskUtilities.FindRootSortOverrideCanvas(transform); Transform stopAfter = MaskUtilities.FindRootSortOverrideCanvas(transform);
_stencilDepth = MaskUtilities.GetStencilDepth(transform, stopAfter); _stencilDepth = MaskUtilities.GetStencilDepth(transform, stopAfter);

View File

@ -44,7 +44,7 @@ namespace Coffee.UIExtensions
} }
// Find the nearest parent softmask. // Find the nearest parent softmask.
var parentTransform = transform; var parentTransform = transform.parent;
while (parentTransform) while (parentTransform)
{ {
var sm = parentTransform.GetComponent<SoftMask>(); var sm = parentTransform.GetComponent<SoftMask>();