@@ -103,60 +103,93 @@ private IEnumerator CollectStats()
103103 }
104104 }
105105
106+ List < Coroutine > coroutines = new List < Coroutine > ( ) ;
107+
106108 foreach ( var sender in activeSenderList . Values . SelectMany ( x => x ) )
107109 {
108- var op = sender . GetStats ( ) ;
109- yield return op ;
110- if ( op . IsError )
111- {
112- continue ;
113- }
114-
115- var report = op . Value ;
116- if ( lastSenderStats . TryGetValue ( sender , out var statsDisplay ) )
117- {
118- statsDisplay . display . text = CreateDisplayString ( report , statsDisplay . lastReport ) ;
119- statsDisplay . lastReport = report ;
120- }
121- else
122- {
123- var text = Instantiate ( baseText , displayParent ) ;
124- text . text = "" ;
125- text . gameObject . SetActive ( true ) ;
126- lastSenderStats [ sender ] = new StatsDisplay { display = text , lastReport = report } ;
127- }
110+ var coroutine = StartCoroutine ( UpdateStats ( sender ) ) ;
111+ coroutines . Add ( coroutine ) ;
128112 }
129113
130114 foreach ( var receiver in activeReceiverList . Values . SelectMany ( x => x ) )
131115 {
132- var op = receiver . GetStats ( ) ;
133- yield return op ;
134-
135- if ( op . IsError )
136- {
137- continue ;
138- }
139-
140- var report = op . Value ;
141- if ( lastReceiverStats . TryGetValue ( receiver , out var statsDisplay ) )
142- {
143- statsDisplay . display . text = CreateDisplayString ( report , statsDisplay . lastReport ) ;
144- statsDisplay . lastReport = report ;
145- }
146- else
147- {
148- var text = Instantiate ( baseText , displayParent ) ;
149- text . text = "" ;
150- text . gameObject . SetActive ( true ) ;
151- lastReceiverStats [ receiver ] = new StatsDisplay { display = text , lastReport = report } ;
152- }
116+ var coroutine = StartCoroutine ( UpdateStats ( receiver ) ) ;
117+ coroutines . Add ( coroutine ) ;
118+ }
119+ foreach ( var coroutine in coroutines )
120+ {
121+ yield return coroutine ;
153122 }
154-
155123 var noStatsData = ! lastSenderStats . Any ( ) && ! lastReceiverStats . Any ( ) ;
156124 baseText . gameObject . SetActive ( noStatsData ) ;
157125 }
158126 }
159127
128+ IEnumerator UpdateStats ( RTCRtpReceiver receiver )
129+ {
130+ var op = receiver . GetStats ( ) ;
131+ yield return op ;
132+
133+ if ( op . IsError )
134+ {
135+ yield break ;
136+ }
137+
138+ var report = op . Value ;
139+ if ( report == null )
140+ {
141+ yield break ;
142+ }
143+
144+ if ( lastReceiverStats . TryGetValue ( receiver , out var statsDisplay ) )
145+ {
146+ var lastReport = statsDisplay . lastReport ;
147+ statsDisplay . display . text = CreateDisplayString ( report , lastReport ) ;
148+ statsDisplay . lastReport = report ;
149+ lastReport . Dispose ( ) ;
150+ }
151+ else
152+ {
153+ var text = Instantiate ( baseText , displayParent ) ;
154+ text . text = "" ;
155+ text . gameObject . SetActive ( true ) ;
156+ lastReceiverStats [ receiver ] = new StatsDisplay { display = text , lastReport = report } ;
157+ }
158+ }
159+
160+ IEnumerator UpdateStats ( RTCRtpSender sender )
161+ {
162+ var op = sender . GetStats ( ) ;
163+ yield return op ;
164+
165+
166+ if ( op . IsError )
167+ {
168+ yield break ;
169+ }
170+
171+ var report = op . Value ;
172+ if ( report == null )
173+ {
174+ yield break ;
175+ }
176+
177+ if ( lastSenderStats . TryGetValue ( sender , out var statsDisplay ) )
178+ {
179+ var lastReport = statsDisplay . lastReport ;
180+ statsDisplay . display . text = CreateDisplayString ( report , lastReport ) ;
181+ statsDisplay . lastReport = report ;
182+ lastReport . Dispose ( ) ;
183+ }
184+ else
185+ {
186+ var text = Instantiate ( baseText , displayParent ) ;
187+ text . text = "" ;
188+ text . gameObject . SetActive ( true ) ;
189+ lastSenderStats [ sender ] = new StatsDisplay { display = text , lastReport = report } ;
190+ }
191+ }
192+
160193 private void SetUpSenderBase ( StreamSenderBase senderBase )
161194 {
162195 if ( alreadySetupSenderList . Contains ( senderBase ) )
0 commit comments