Skip to content

Commit 8d922b7

Browse files
authored
fix: Call GetStats multi times at the same time in StatsUI (#783)
* wip * fix * dispose explicitly
1 parent df423b6 commit 8d922b7

File tree

1 file changed

+75
-42
lines changed

1 file changed

+75
-42
lines changed

com.unity.renderstreaming/Samples~/Example/Stats/ShowStatsUI.cs

Lines changed: 75 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)