Skip to content

Commit 6c91b7b

Browse files
committed
add a mechanism to suppress eager updates
1 parent 16bb3a2 commit 6c91b7b

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

Source/DynamicProperties/MaterialPropertyManager.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public sealed class MaterialPropertyManager : MonoBehaviour
1313

1414
private readonly Dictionary<Renderer, PropsCascade> rendererCascades = [];
1515

16+
private readonly List<Props> propsLateUpdateQueue = [];
17+
1618
#endregion
1719

1820
#region Lifecycle
@@ -83,4 +85,34 @@ public bool Remove(Props props)
8385

8486
return removed;
8587
}
88+
89+
private bool _propRefreshScheduled = false;
90+
private static readonly WaitForEndOfFrame WfEoF = new();
91+
92+
private IEnumerator<YieldInstruction> Co_propsLateUpdate()
93+
{
94+
yield return WfEoF;
95+
96+
foreach (var props in propsLateUpdateQueue) {
97+
if (props.NeedsEntriesUpdate) {
98+
props.OnEntriesChanged(props);
99+
} else if (props.NeedsValueUpdate) {
100+
props.OnValueChanged(props);
101+
}
102+
103+
props.SuppressEagerUpdate =
104+
props.NeedsEntriesUpdate = props.NeedsValueUpdate = false;
105+
}
106+
107+
propsLateUpdateQueue.Clear();
108+
_propRefreshScheduled = false;
109+
}
110+
111+
internal void ScheduleLateUpdate(Props props)
112+
{
113+
propsLateUpdateQueue.Add(props);
114+
if (_propRefreshScheduled) return;
115+
StartCoroutine(Co_propsLateUpdate());
116+
_propRefreshScheduled = true;
117+
}
86118
}

Source/DynamicProperties/Props.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,16 @@ public sealed class Props(int priority) : IDisposable
111111
internal PropsUpdateHandler OnValueChanged = delegate { };
112112
internal PropsUpdateHandler OnEntriesChanged = delegate { };
113113

114+
internal bool SuppressEagerUpdate = false;
115+
internal bool NeedsValueUpdate = false;
116+
internal bool NeedsEntriesUpdate = false;
117+
118+
public void SuppressEagerUpdatesThisFrame()
119+
{
120+
SuppressEagerUpdate = true;
121+
MaterialPropertyManager.Instance.ScheduleLateUpdate(this);
122+
}
123+
114124
[MethodImpl(MethodImplOptions.AggressiveInlining)]
115125
private void _internalSet<T, TProp>(int id, T value) where TProp : Prop<T>
116126
{
@@ -119,7 +129,13 @@ private void _internalSet<T, TProp>(int id, T value) where TProp : Prop<T>
119129
if (EqualityComparer<T>.Default.Equals(value, typedProp.Value)) return;
120130

121131
typedProp.Value = value;
122-
OnValueChanged(this);
132+
133+
if (!SuppressEagerUpdate) {
134+
OnValueChanged(this);
135+
} else {
136+
NeedsValueUpdate = true;
137+
}
138+
123139
return;
124140
}
125141

@@ -128,7 +144,12 @@ private void _internalSet<T, TProp>(int id, T value) where TProp : Prop<T>
128144
}
129145

130146
props[id] = (TProp)Activator.CreateInstance(typeof(TProp), value);
131-
OnEntriesChanged(this);
147+
148+
if (!SuppressEagerUpdate) {
149+
OnEntriesChanged(this);
150+
} else {
151+
NeedsEntriesUpdate = true;
152+
}
132153
}
133154

134155
[MethodImpl(MethodImplOptions.AggressiveInlining)]

0 commit comments

Comments
 (0)