Skip to content

Commit dff29af

Browse files
committed
check dead cache entry more eagerly
1 parent e0349e1 commit dff29af

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

Source/DynamicProperties/MpbCompiler.cs

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ namespace Shabby.DynamicProperties;
1010

1111
internal class MpbCompiler : IDisposable
1212
{
13+
#region Fields
14+
1315
/// Immutable.
1416
internal readonly SortedSet<Props> Cascade;
1517

@@ -19,8 +21,13 @@ internal class MpbCompiler : IDisposable
1921

2022
private static readonly MaterialPropertyBlock EmptyMpb = new();
2123

24+
#endregion
25+
2226
internal MpbCompiler(SortedSet<Props> cascades)
2327
{
28+
MaterialPropertyManager.Instance?.LogDebug(
29+
$"new cache entry {RuntimeHelpers.GetHashCode(this)}");
30+
2431
Cascade = cascades;
2532
RebuildManagerMap();
2633
RewriteMpb();
@@ -30,6 +37,8 @@ internal MpbCompiler(SortedSet<Props> cascades)
3037
}
3138
}
3239

40+
#region Renderer registration
41+
3342
internal void Register(Renderer renderer)
3443
{
3544
linkedRenderers.Add(renderer);
@@ -40,8 +49,21 @@ internal void Unregister(Renderer renderer)
4049
{
4150
linkedRenderers.Remove(renderer);
4251
renderer.SetPropertyBlock(EmptyMpb);
52+
CheckLiveness();
4353
}
4454

55+
private void CheckLiveness()
56+
{
57+
if (linkedRenderers.Count > 0) return;
58+
MaterialPropertyManager.Instance.LogDebug(
59+
$"dead cache entry {RuntimeHelpers.GetHashCode(this)}");
60+
PropsCascade.RemoveCacheEntry(this);
61+
}
62+
63+
#endregion
64+
65+
#region Props updates
66+
4567
private void RebuildManagerMap()
4668
{
4769
idManagerMap.Clear();
@@ -65,16 +87,20 @@ private void RebuildManagerMap()
6587
private void OnPropsValueChanged(Props props)
6688
{
6789
WriteMpb(props);
68-
Apply();
90+
ApplyAll();
6991
}
7092

7193
private void OnPropsEntriesChanged(Props props)
7294
{
7395
RebuildManagerMap();
7496
RewriteMpb();
75-
Apply();
97+
ApplyAll();
7698
}
7799

100+
#endregion
101+
102+
#region Apply
103+
78104
[MethodImpl(MethodImplOptions.AggressiveInlining)]
79105
private void WriteMpb(Props props)
80106
{
@@ -92,7 +118,7 @@ private void RewriteMpb()
92118

93119
private readonly List<Renderer> _deadRenderers = [];
94120

95-
internal void Apply()
121+
private void ApplyAll()
96122
{
97123
foreach (var renderer in linkedRenderers) {
98124
if (renderer == null) {
@@ -108,12 +134,13 @@ internal void Apply()
108134
MaterialPropertyManager.Instance.Remove(dead);
109135
}
110136

111-
if (linkedRenderers.Count == 0) {
112-
MaterialPropertyManager.Instance.LogDebug("dead cache entry");
113-
PropsCascade.RemoveCacheEntry(this);
114-
}
137+
CheckLiveness();
115138
}
116139

140+
#endregion
141+
142+
#region dtor
143+
117144
private bool _disposed = false;
118145

119146
private void UnlinkProps()
@@ -140,4 +167,6 @@ public void Dispose()
140167
{
141168
UnlinkProps();
142169
}
170+
171+
#endregion
143172
}

Source/DynamicProperties/PropsCascade.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ private void ReacquireCompiler()
4545
mpbCompiler?.Unregister(Renderer);
4646

4747
if (!MpbCache.TryGetValue(cascade, out mpbCompiler)) {
48-
MaterialPropertyManager.Instance.LogDebug("building new cache entry");
49-
5048
// Don't accidentally mutate the cache key...
5149
var clonedCascade = new SortedSet<Props>(cascade, Props.PriorityComparer);
5250
mpbCompiler = new MpbCompiler(clonedCascade);

0 commit comments

Comments
 (0)