@@ -57,10 +57,7 @@ private void OnDestroy()
57
57
58
58
public bool Set ( Renderer renderer , Props props )
59
59
{
60
- if ( renderer == null ) {
61
- this . LogWarning ( $ "cannot set property on null renderer { renderer . GetHashCode ( ) } ") ;
62
- return false ;
63
- }
60
+ if ( ! CheckRendererAlive ( renderer ) ) return false ;
64
61
65
62
if ( ! rendererCascades . TryGetValue ( renderer , out var cascade ) ) {
66
63
rendererCascades [ renderer ] = cascade = new PropsCascade ( renderer ) ;
@@ -69,15 +66,18 @@ public bool Set(Renderer renderer, Props props)
69
66
return cascade . Add ( props ) ;
70
67
}
71
68
72
- public bool Remove ( Renderer renderer , Props props )
69
+ public bool Unset ( Renderer renderer , Props props )
73
70
{
71
+ if ( ! CheckRendererAlive ( renderer ) ) return false ;
74
72
if ( ! rendererCascades . TryGetValue ( renderer , out var cascade ) ) return false ;
75
73
return cascade . Remove ( props ) ;
76
74
}
77
75
78
- public bool Remove ( Renderer renderer )
76
+ public bool Unregister ( Renderer renderer )
79
77
{
78
+ if ( ( object ) renderer == null ) return false ;
80
79
if ( ! rendererCascades . Remove ( renderer , out var cascade ) ) return false ;
80
+ if ( renderer == null ) this . LogDebug ( $ "dead renderer { renderer . GetHashCode ( ) } ") ;
81
81
cascade . Dispose ( ) ;
82
82
return true ;
83
83
}
@@ -89,10 +89,34 @@ public static void RegisterPropertyNamesForDebugLogging(params string[] properti
89
89
90
90
#endregion
91
91
92
+ private bool CheckRendererAlive ( Renderer renderer )
93
+ {
94
+ if ( renderer != null ) return true ;
95
+ this . LogWarning ( $ "cannot modify null renderer { renderer ? . GetHashCode ( ) } ") ;
96
+ if ( ( object ) renderer != null ) Unregister ( renderer ) ;
97
+ return false ;
98
+ }
99
+
100
+ private readonly List < Renderer > _deadRenderers = [ ] ;
101
+
102
+ internal void CheckRemoveDeadRenderers ( )
103
+ {
104
+ foreach ( var renderer in rendererCascades . Keys ) {
105
+ if ( renderer == null ) _deadRenderers . Add ( renderer ) ;
106
+ }
107
+
108
+ foreach ( var deadRenderer in _deadRenderers ) Unregister ( deadRenderer ) ;
109
+ _deadRenderers . Clear ( ) ;
110
+ }
111
+
92
112
/// Public API equivalent is calling `Props.Dispose`.
93
- internal void Remove ( Props props )
113
+ internal void Unregister ( Props props )
94
114
{
95
- foreach ( var cascade in rendererCascades . Values ) cascade . Remove ( props ) ;
115
+ foreach ( var ( renderer , cascade ) in rendererCascades ) {
116
+ if ( renderer != null ) cascade . Remove ( props ) ;
117
+ }
118
+
119
+ CheckRemoveDeadRenderers ( ) ;
96
120
}
97
121
98
122
private bool _propRefreshScheduled = false ;
0 commit comments