Stats.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. const log$h = new Logger("stats")
  2. , numberFormat = new Intl.NumberFormat(window.navigator.language,{
  3. maximumFractionDigits: 0
  4. });
  5. class Stats extends EventEmitter {
  6. constructor(e) {
  7. super();
  8. E(this, "_interval", null);
  9. E(this, "_netInterval", null);
  10. E(this, "_disabled", !1);
  11. E(this, "_show", !1);
  12. E(this, "_aggregatedStats", {});
  13. E(this, "_displayElement", null);
  14. E(this, "_extraStats", {});
  15. E(this, "_networkSamples", []);
  16. E(this, "externalStats");
  17. E(this, "constructedTime");
  18. this.room = e,
  19. this.constructedTime = Date.now(),
  20. this._interval = window.setInterval(()=>{
  21. var t, r, n;
  22. this._disabled || this.onStats((n = (r = (t = e.networkController) == null ? void 0 : t.rtcp) == null ? void 0 : r.workers) == null ? void 0 : n.uploadDataToServer())
  23. }
  24. , 1e3),
  25. this._netInterval = window.setInterval(()=>{
  26. this.getIsWeakNet()
  27. }
  28. , NET_INTERVAL * 1e3)
  29. }
  30. get isShow() {
  31. return this._show
  32. }
  33. assign(e) {
  34. Object.assign(this._extraStats, e),
  35. ((e == null ? void 0 : e.hb) || (e == null ? void 0 : e.rtt)) && this.startStatsNetSamples()
  36. }
  37. appendExternalStats(e) {
  38. const t = {};
  39. if (!e || typeof e != "object") {
  40. console.warn("appendExternalStats should be plain object");
  41. return
  42. }
  43. Object.keys(e).forEach(r=>{
  44. Object.prototype.hasOwnProperty.call(this._aggregatedStats, r) ? console.warn(`${r} is duplicate with internal stats`) : t[r] = e[r]
  45. }
  46. ),
  47. !(Object.keys(t).length > 10) && (this.externalStats = t)
  48. }
  49. getRtt() {
  50. const e = this._extraStats.rtt;
  51. return typeof e != "number" ? 0 : e > 999 ? 999 : e
  52. }
  53. enable() {
  54. this._disabled = !1
  55. }
  56. disable() {
  57. this._disabled = !0
  58. }
  59. disableNet() {
  60. this._netInterval && window.clearInterval(this._netInterval)
  61. }
  62. show() {
  63. this._show = !0,
  64. this._render()
  65. }
  66. hide() {
  67. this._show = !1,
  68. this._displayElement && document.body.removeChild(this._displayElement),
  69. this._displayElement = null
  70. }
  71. getIsWeakNet() {
  72. let e = !1;
  73. const t = this._networkSamples.length - 1;
  74. if (t < 0)
  75. return;
  76. const r = this._networkSamples[t].time
  77. , n = this._networkSamples[0].time
  78. , o = r - n
  79. , a = 1e3 * (DURATION - 2);
  80. if (o < a)
  81. return;
  82. const s = this._networkSamples.map(g=>this.isNetDelay(g, "rtt"))
  83. , l = this._networkSamples.map(g=>this.isNetDelay(g, "hb"))
  84. , u = s.reduce((g,m)=>g + m, 0)
  85. , c = l.reduce((g,m)=>g + m, 0)
  86. , h = Math.floor(u / this._networkSamples.length) * 100
  87. , f = Math.floor(c / this._networkSamples.length) * 100
  88. , d = 70;
  89. (h >= d || f >= d) && (e = !0);
  90. const _ = this.room.viewMode === "observer" || this.room.viewMode === "serverless";
  91. e && !_ && (log$h.infoAndReportMeasurement({
  92. metric: "weakNetwork",
  93. startTime: Date.now(),
  94. extra: {
  95. msg: this._networkSamples.slice(20),
  96. netDelayRTTValues: u,
  97. netDelayHBValues: c
  98. }
  99. }),
  100. this.emit("weakNetwork"))
  101. }
  102. startStatsNetSamples() {
  103. const {rtt: e, hb: t} = this._extraStats;
  104. if (e || t) {
  105. const r = {
  106. rtt: e,
  107. hb: t,
  108. time: new Date().getTime()
  109. };
  110. this._networkSamples.push(r);
  111. const n = this._networkSamples.length - 1;
  112. if (n < 0)
  113. return;
  114. const o = this._networkSamples[n].time
  115. , a = 1e3 * DURATION;
  116. this._networkSamples = this._networkSamples.filter(s=>s.time > o - a)
  117. }
  118. }
  119. isNetDelay(e, t) {
  120. return t === "rtt" ? e.rtt > RTT_MAX_VALUE ? 1 : 0 : t === "hb" && e.hb > HB_MAX_VALUE ? 1 : 0
  121. }
  122. getPreciesTimer(e, t) {
  123. const r = t * 1e3
  124. , n = new Date().getTime();
  125. let o = 0;
  126. o++;
  127. const a = new Date().getTime() - (n + o * 1e3)
  128. , s = r - a
  129. , l = setTimeout(()=>{
  130. clearTimeout(l),
  131. e()
  132. }
  133. , s)
  134. }
  135. _render() {
  136. var c, h, f, d, _, g, m, v, y, b, T, C, A, S, P, R, M, x, I, w;
  137. if (!this._aggregatedStats)
  138. return;
  139. this._displayElement || (this._displayElement = document.createElement("div"),
  140. this._displayElement.style.position = "absolute",
  141. this._displayElement.style.top = "10px",
  142. this._displayElement.style.left = "200px",
  143. this._displayElement.style.width = "200px",
  144. this._displayElement.style.backgroundColor = "rgba(0,0,0,.5)",
  145. this._displayElement.style.color = "white",
  146. this._displayElement.style.textAlign = "left",
  147. this._displayElement.style.fontSize = "8px",
  148. this._displayElement.style.lineHeight = "10px",
  149. document.body.appendChild(this._displayElement));
  150. const e = []
  151. , t = Date.now() - this.constructedTime
  152. , r = Math.floor(t / 1e3 % 60)
  153. , n = Math.floor(t / (1e3 * 60) % 60)
  154. , o = Math.floor(t / (1e3 * 60 * 60) % 24)
  155. , a = o < 10 ? "0" + o.toString() : o.toString()
  156. , s = n < 10 ? "0" + n : n
  157. , l = r < 10 ? "0" + r : r;
  158. e.push({
  159. key: new Date(Math.floor(this._aggregatedStats.timestamp || 0)).toLocaleString("en-GB"),
  160. value: a + ":" + s + ":" + l
  161. }),
  162. e.push({
  163. key: "rtt: " + this._extraStats.rtt + " hb: " + this._extraStats.hb,
  164. value: "FPS: " + this._extraStats.fps + " avatar: " + ((c = this.room._userAvatar) == null ? void 0 : c.state)
  165. }),
  166. e.push({
  167. key: "SDK: " + Xverse$1.SUB_PACKAGE_VERSION,
  168. value: "ENGINE:" + VERSION$1 + " uid:" + this._extraStats.userId
  169. }),
  170. e.push({
  171. key: "\u540C\u6B65/\u6709\u6548/\u663E\u793A\u73A9\u5BB6",
  172. value: `${this._extraStats.syncUserNum || 0}/${this._extraStats.userNum || 0}/${this._extraStats.renderedUserNum || 0}`
  173. }),
  174. e.push({
  175. key: "media/meta bitrate(kbps)",
  176. value: numberFormat.format(this._aggregatedStats.mediaBitrate || 0) + "/" + numberFormat.format(this._aggregatedStats.metaBitrate || 0)
  177. }),
  178. e.push({
  179. key: ":----------------Decoding---------------",
  180. value: ""
  181. }),
  182. e.push({
  183. key: "-max/avg decodeTime(ms)",
  184. value: numberFormat.format(this._aggregatedStats.decodeTimeMaxFrame || 0) + "/" + numberFormat.format(this._aggregatedStats.decodeTimePerFrame || 0)
  185. }),
  186. e.push({
  187. key: "-frmAwait/Lost/Drop",
  188. value: numberFormat.format(this._aggregatedStats.framesAwait || 0) + "/" + numberFormat.format(this._aggregatedStats.packetsLost || 0) + "/" + numberFormat.format(this._aggregatedStats.packetsDrop || 0) + "/" + numberFormat.format(this._aggregatedStats.updateDropFrame) || 0
  189. }),
  190. e.push({
  191. key: ":----------------FrameLoop-------------",
  192. value: ""
  193. }),
  194. e.push({
  195. key: "interval(max/avg/>40)",
  196. value: (((h = this._extraStats.maxFrameTime) == null ? void 0 : h.toFixed(1)) || 0) + "/" + (((f = this._extraStats.avgFrameTime) == null ? void 0 : f.toFixed(0)) || 0) + "/" + this._extraStats.engineSloppyCnt
  197. }),
  198. e.push({
  199. key: "systemStuck",
  200. value: this._extraStats.systemStuckCnt
  201. }),
  202. e.push({
  203. key: "--update",
  204. value: (this._aggregatedStats.maxGraphicTime.toFixed(1) || 0) + "/" + (((d = this._aggregatedStats.averageGraphicTime) == null ? void 0 : d.toFixed(0)) || 0)
  205. }),
  206. e.push({
  207. key: "--timeout",
  208. value: (((_ = this._extraStats.maxTimeoutTime) == null ? void 0 : _.toFixed(1)) || 0) + "/" + ((g = this._extraStats.avgTimeoutTime) == null ? void 0 : g.toFixed(0)) || 0
  209. }),
  210. e.push({
  211. key: "--render",
  212. value: (((m = this._extraStats.maxRenderFrameTime) == null ? void 0 : m.toFixed(1)) || 0) + "/" + (((v = this._extraStats.renderFrameTime) == null ? void 0 : v.toFixed(0)) || 0)
  213. }),
  214. e.push({
  215. key: "---anim/regBR/clip(avg ms)",
  216. value: (this._extraStats.animationTime.toFixed(2) || 0) + " / " + (this._extraStats.registerBeforeRenderTime.toFixed(2) || 0) + " / " + (this._extraStats.meshSelectTime.toFixed(2) || 0)
  217. }),
  218. e.push({
  219. key: "---anim/regBR/clip(max ms)",
  220. value: (this._extraStats.maxAnimationTime.toFixed(2) || 0) + " / " + (this._extraStats.maxRegisterBeforeRenderTime.toFixed(2) || 0) + " / " + (this._extraStats.maxMeshSelectTime.toFixed(2) || 0)
  221. }),
  222. e.push({
  223. key: "---rTR/drC/regAF(avg ms)",
  224. value: (this._extraStats.renderTargetRenderTime.toFixed(2) || 0) + " / " + (this._extraStats.drawcallTime.toFixed(2) || 0) + " / " + (this._extraStats.registerAfterRenderTime.toFixed(2) || 0)
  225. }),
  226. e.push({
  227. key: "---rTR/drC/regAF(max ms)",
  228. value: (this._extraStats.maxRenderTargetRenderTime.toFixed(2) || 0) + " / " + (this._extraStats.maxDrawcallTime.toFixed(2) || 0) + " / " + (this._extraStats.maxRegisterAfterRenderTime.toFixed(2) || 0)
  229. }),
  230. e.push({
  231. key: "--tri/drC/pati/bones/anim(Num)",
  232. value: (this._extraStats.triangle || 0) + " / " + (this._extraStats.drawcall.toFixed(0) || 0) + " / " + (this._extraStats.activeParticles.toFixed(0) || 0) + " / " + (this._extraStats.activeBones.toFixed(0) || 0) + " / " + (this._extraStats.activeAnimation.toFixed(0) || 0)
  233. }),
  234. e.push({
  235. key: "--rootN/mesh/geo/tex/mat(Num)",
  236. value: (this._extraStats.totalRootNodes.toFixed(0) || 0) + " / " + (this._extraStats.totalMeshes.toFixed(0) || 0) + " / " + (this._extraStats.totalGeometries.toFixed(0) || 0) + " / " + (this._extraStats.totalTextures.toFixed(0) || 0) + " / " + (this._extraStats.totalMaterials.toFixed(0) || 0)
  237. }),
  238. e.push({
  239. key: "--registerBF/AF(Num)",
  240. value: (this._extraStats.registerBeforeCount.toFixed(0) || 0) + " / " + (this._extraStats.registerAfterCount.toFixed(0) || 0)
  241. }),
  242. e.push({
  243. key: ":----------------Rotation-------------------",
  244. value: ""
  245. }),
  246. e.push({
  247. key: "Total(ms/miss)",
  248. value: (((y = this._aggregatedStats.avgOverallTime) == null ? void 0 : y.toFixed(2)) || 0) + "/" + (this._aggregatedStats.responseMissPs + this._aggregatedStats.processMissPs + this._aggregatedStats.displayMissPs)
  249. }),
  250. e.push({
  251. key: "--rotateRsp",
  252. value: (((b = this._aggregatedStats.avgResponseTime) == null ? void 0 : b.toFixed(1)) || 0) + "/" + this._aggregatedStats.responseMissPs
  253. }),
  254. e.push({
  255. key: "--rotateProc",
  256. value: (((T = this._aggregatedStats.avgProcessTime) == null ? void 0 : T.toFixed(1)) || 0) + "/" + this._aggregatedStats.processMissPs
  257. }),
  258. e.push({
  259. key: "--rotateShow",
  260. value: (((C = this._aggregatedStats.avgDisplayTime) == null ? void 0 : C.toFixed(1)) || 0) + "/" + this._aggregatedStats.displayMissPs
  261. }),
  262. ((A = this.room._userAvatar) == null ? void 0 : A.state) == "moving",
  263. e.push({
  264. key: ":----------------Move----------------------",
  265. value: ""
  266. }),
  267. e.push({
  268. key: "-startDelay",
  269. value: (this._aggregatedStats.moveEvent == "MoveTo" ? this._aggregatedStats.moveResponseDelay || 0 : this._aggregatedStats.flyResponseDelay || 0) + "/" + (this._aggregatedStats.moveEvent == "MoveTo" ? this._aggregatedStats.moveProcessDelay || 0 : this._aggregatedStats.flyProcessDelay || 0) + "/" + (this._aggregatedStats.moveEvent == "MoveTo" ? this._aggregatedStats.moveDisplayDelay || 0 : this._aggregatedStats.flyDisplayDelay || 0)
  270. }),
  271. (((S = this.room._userAvatar) == null ? void 0 : S.state) == "moving" || this._aggregatedStats.moveEvent == "GetOnAirship" || this._aggregatedStats.moveEvent == "GetOnVehicle") && e.push({
  272. key: "-srvInterFrm(max/avg)",
  273. value: (this._aggregatedStats.maxServerDiff || 0) + "/" + (this._aggregatedStats.avgServerDiff.toFixed(1) || 0)
  274. }),
  275. e.push({
  276. key: "-interFrameDelay",
  277. value: "(max/avg/jank)"
  278. }),
  279. e.push({
  280. key: "--toDisplay",
  281. value: (this._aggregatedStats.moveEvent == "MoveTo" ? this._aggregatedStats.maxDisplayMoveDiff || 0 : this._aggregatedStats.maxDisplayFlyDiff || 0) + "/" + (this._aggregatedStats.moveEvent == "MoveTo" ? this._aggregatedStats.avgDisplayMoveDiff.toFixed(1) || 0 : this._aggregatedStats.avgDisplayFlyDiff.toFixed(1) || 0) + "/" + (this._aggregatedStats.moveEvent == "MoveTo" ? ((P = this._aggregatedStats.moveDisplayJank) == null ? void 0 : P.toFixed(3)) || 0 : ((R = this._aggregatedStats.flyDisplayJank) == null ? void 0 : R.toFixed(3)) || 0)
  282. }),
  283. e.push({
  284. key: "--received",
  285. value: (this._aggregatedStats.moveEvent == "MoveTo" ? this._aggregatedStats.maxResponseMoveDiff || 0 : this._aggregatedStats.maxResponseFlyDiff || 0) + "/" + (this._aggregatedStats.moveEvent == "MoveTo" ? this._aggregatedStats.avgResponseMoveDiff.toFixed(1) || 0 : this._aggregatedStats.avgResponseFlyDiff.toFixed(1) || 0) + "/" + (this._aggregatedStats.moveEvent == "MoveTo" ? ((M = this._aggregatedStats.moveResponseJank) == null ? void 0 : M.toFixed(3)) || 0 : ((x = this._aggregatedStats.flyResponseJank) == null ? void 0 : x.toFixed(3)) || 0)
  286. }),
  287. e.push({
  288. key: "--decoded",
  289. value: (this._aggregatedStats.moveEvent == "MoveTo" ? this._aggregatedStats.maxProcessMoveDiff || 0 : this._aggregatedStats.maxProcessFlyDiff || 0) + "/" + (this._aggregatedStats.moveEvent == "MoveTo" ? this._aggregatedStats.avgProcessMoveDiff.toFixed(1) || 0 : this._aggregatedStats.avgProcessFlyDiff.toFixed(1) || 0) + "/" + (this._aggregatedStats.moveEvent == "MoveTo" ? ((I = this._aggregatedStats.moveProcessJank) == null ? void 0 : I.toFixed(3)) || 0 : ((w = this._aggregatedStats.flyProcessJank) == null ? void 0 : w.toFixed(3)) || 0)
  290. }),
  291. e.push({
  292. key: ":----------------DevInfo-----------------",
  293. value: ""
  294. }),
  295. e.push({
  296. key: "sd",
  297. value: (this._aggregatedStats.sdMoveResponseLongTime.toFixed(1) || 0) + "/" + (this._aggregatedStats.sdMoveProcessLongTime.toFixed(1) || 0) + "/" + (this._aggregatedStats.sdMoveDisplayLongTime.toFixed(1) || 0)
  298. }),
  299. e.push({
  300. key: "----hardwareInfo",
  301. value: this._extraStats.hardwareInfo
  302. });
  303. let u = "";
  304. for (const O of e)
  305. u += `<div><span>${O.key}</span>: <span>${O.value}</span> </div>`;
  306. this._displayElement.innerHTML = u
  307. }
  308. onStats(e) {
  309. var n;
  310. if (!e)
  311. return;
  312. const t = {}
  313. , r = this;
  314. r._aggregatedStats || (r._aggregatedStats = {}),
  315. t.timestamp = e.timestamp,
  316. t.mediaBytesReceived = e.mediaBytesReceived,
  317. t.metaBytesReceived = e.metaBytesReceived,
  318. t.packetsLost = e.packetsLost,
  319. t.frameHeight = e.frameHeight,
  320. t.frameWidth = e.frameWidth,
  321. t.framesReceivedUI = e.framesReceived,
  322. t.framesReceived = e.framesReceivedWorker,
  323. t.framesDecoded = e.framesDecoded,
  324. t.framesEmited = e.framesEmited,
  325. t.decodeTimePerFrame = e.decodeTimePerFrame,
  326. t.decodeTimeMaxFrame = e.decodeTimeMaxFrame,
  327. t.packetsDrop = e.packetsDrop,
  328. t.framesAwait = e.framesAwait,
  329. t.updateDropFrame = e.updateDropFrame,
  330. t.firstMediaArraval = e.firstMediaArraval,
  331. t.firstYUVDecoded = e.firstYUVDecoded,
  332. t.firstRender = e.firstRender,
  333. t.returnFrames = e.returnFrames,
  334. t.sendOutBuffer = e.sendOutBuffer,
  335. t.averageGraphicTime = e.averageGraphicTime,
  336. t.maxGraphicTime = e.maxGraphicTime,
  337. t.jankTimes = e.jankTimes,
  338. t.bigJankTimes = e.bigJankTimes,
  339. t.decodeJankTimes = e.decodeJankTimes,
  340. t.bigDecodeJankTimes = e.bigDecodeJankTimes,
  341. t.serverFrameFast = e.serverFrameFast,
  342. t.serverFrameSlow = e.serverFrameSlow,
  343. t.clientFrameFast = e.clientFrameFast,
  344. t.clientFrameSlow = e.clientFrameSlow,
  345. t.rtcMessageReceived = e.rtcMessageReceived,
  346. t.rtcBytesReceived = e.rtcBytesReceived,
  347. t.receiveIframes = e.receiveIframes,
  348. t.decodeIframes = e.decodeIframes,
  349. t.avgResponseTime = e.avgResponseTime,
  350. t.avgProcessTime = e.avgProcessTime,
  351. t.avgDisplayTime = e.avgDisplayTime,
  352. t.avgOverallTime = e.avgOverallTime,
  353. t.overallTimeCount = e.overallTimeCount,
  354. t.responseMiss = e.responseMiss,
  355. t.processMiss = e.processMiss,
  356. t.displayMiss = e.displayMiss,
  357. t.avgResponseMoveDiff = e.avgResponseMoveDiff,
  358. t.avgProcessMoveDiff = e.avgProcessMoveDiff,
  359. t.avgDisplayMoveDiff = e.avgDisplayMoveDiff,
  360. t.maxResponseMoveDiff = e.maxResponseMoveDiff,
  361. t.maxProcessMoveDiff = e.maxProcessMoveDiff,
  362. t.maxDisplayMoveDiff = e.maxDisplayMoveDiff,
  363. t.moveResponseDelay = e.moveResponseDelay,
  364. t.moveProcessDelay = e.moveProcessDelay,
  365. t.moveDisplayDelay = e.moveDisplayDelay,
  366. t.moveResponseJank = e.moveResponseJank,
  367. t.moveProcessJank = e.moveProcessJank,
  368. t.moveDisplayJank = e.moveDisplayJank,
  369. t.avgMetaParseTime = e.avgMetaParseTime,
  370. t.maxMetaParseTime = e.maxMetaParseTime,
  371. t.moveResponseCounts = e.moveResponseCounts,
  372. t.moveProcessCounts = e.moveProcessCounts,
  373. t.moveDisplayCounts = e.moveDisplayCounts,
  374. t.MoveDisplayCountGood = e.MoveDisplayCountGood,
  375. t.MoveDisplayCountWell = e.MoveDisplayCountWell,
  376. t.MoveDisplayCountFair = e.MoveDisplayCountFair,
  377. t.MoveDisplayCountBad = e.MoveDisplayCountBad,
  378. t.MoveDisplayCountRest = e.MoveDisplayCountRest,
  379. t.avgServerDiff = e.avgServerDiff,
  380. t.maxServerDiff = e.maxServerDiff,
  381. t.avgResponseFlyDiff = e.avgResponseFlyDiff,
  382. t.avgProcessFlyDiff = e.avgProcessFlyDiff,
  383. t.avgDisplayFlyDiff = e.avgDisplayFlyDiff,
  384. t.maxResponseFlyDiff = e.maxResponseFlyDiff,
  385. t.maxProcessFlyDiff = e.maxProcessFlyDiff,
  386. t.maxDisplayFlyDiff = e.maxDisplayFlyDiff,
  387. t.flyResponseCounts = e.flyResponseCounts,
  388. t.flyProcessCounts = e.flyProcessCounts,
  389. t.flyDisplayCounts = e.flyDisplayCounts,
  390. t.flyResponseJank = e.flyResponseJank,
  391. t.flyProcessJank = e.flyProcessJank,
  392. t.flyDisplayJank = e.flyDisplayJank,
  393. t.flyResponseDelay = e.flyResponseDelay,
  394. t.flyProcessDelay = e.flyProcessDelay,
  395. t.flyDisplayDelay = e.flyDisplayDelay,
  396. t.moveEvent = e.moveEvent,
  397. t.sdMoveResponseLongTime = e.sdMoveResponseLongTime,
  398. t.sdMoveProcessLongTime = e.sdMoveProcessLongTime,
  399. t.sdMoveDisplayLongTime = e.sdMoveDisplayLongTime,
  400. r._aggregatedStats && r._aggregatedStats.timestamp && (t.mediaBitrate = 8 * (t.mediaBytesReceived - r._aggregatedStats.mediaBytesReceived) / 1e3,
  401. t.mediaBitrate = Math.round(t.mediaBitrate || 0),
  402. t.metaBitrate = 8 * (t.metaBytesReceived - r._aggregatedStats.metaBytesReceived) / 1e3,
  403. t.metaBitrate = Math.round(t.metaBitrate || 0),
  404. t.rtcMessagePs = t.rtcMessageReceived - r._aggregatedStats.rtcMessageReceived,
  405. t.rtcBitrate = 8 * (t.rtcBytesReceived - r._aggregatedStats.rtcBytesReceived) / 1e3,
  406. t.rtcBitrate = Math.round(t.rtcBitrate || 0),
  407. t.framesEmitedPs = t.framesEmited - r._aggregatedStats.framesEmited,
  408. t.framesEmitedPs = Math.round(t.framesEmitedPs || 0),
  409. t.framesReceivedPs = t.framesReceived - r._aggregatedStats.framesReceived,
  410. t.framesReceivedPs = Math.round(t.framesReceivedPs || 0),
  411. t.framesDecodedPs = t.framesDecoded - r._aggregatedStats.framesDecoded,
  412. t.framesDecodedPs = Math.round(t.framesDecodedPs || 0),
  413. t.returnFramesPs = t.returnFrames - r._aggregatedStats.returnFrames,
  414. t.returnFramesPs = Math.round(t.returnFramesPs || 0),
  415. t.responseMissPs = t.responseMiss - r._aggregatedStats.responseMiss,
  416. t.processMissPs = t.processMiss - r._aggregatedStats.processMiss,
  417. t.displayMissPs = t.displayMiss - r._aggregatedStats.displayMiss,
  418. t.returnFrames = e.returnFrames),
  419. this._show && this._render(),
  420. t.registerBeforeRenderTime = this._extraStats.registerBeforeRenderTime,
  421. t.registerAfterRenderTime = this._extraStats.registerAfterRenderTime,
  422. t.renderTargetRenderTime = this._extraStats.renderTargetRenderTime,
  423. t.renderFrameTime = this._extraStats.renderFrameTime,
  424. t.maxRenderFrameTime = this._extraStats.maxRenderFrameTime,
  425. t.interFrameTime = this._extraStats.interFrameTime,
  426. t.animationTime = this._extraStats.animationTime,
  427. t.meshSelectTime = this._extraStats.meshSelectTime,
  428. t.drawcall = this._extraStats.drawcall,
  429. t.drawcallTime = this._extraStats.drawcallTime,
  430. t.triangle = this._extraStats.triangle,
  431. t.registerAfterCount = this._extraStats.registerAfterCount,
  432. t.registerBeforeCount = this._extraStats.registerBeforeCount,
  433. t.fps = this._extraStats.fps,
  434. t.rtt = this._extraStats.rtt,
  435. t.hb = this._extraStats.hb,
  436. t.avgFrameTime = this._extraStats.avgFrameTime,
  437. t.avgTimeoutTime = this._extraStats.avgTimeoutTime,
  438. t.engineSloppyCnt = this._extraStats.engineSloppyCnt,
  439. t.systemStuckCnt = this._extraStats.systemStuckCnt,
  440. t.avatarState = (n = this.room._userAvatar) == null ? void 0 : n.state,
  441. t.maxFrameTime = this._extraStats.maxFrameTime,
  442. t.maxTimeoutTime = this._extraStats.maxTimeoutTime,
  443. t.activeParticles = this._extraStats.activeParticles,
  444. t.activeBones = this._extraStats.activeBones,
  445. t.activeAnimation = this._extraStats.activeAnimation,
  446. t.totalRootNodes = this._extraStats.totalRootNodes,
  447. t.totalGeometries = this._extraStats.totalGeometries,
  448. t.totalMeshes = this._extraStats.totalMeshes,
  449. t.totalTextures = this._extraStats.totalTextures,
  450. t.totalMaterials = this._extraStats.totalMaterials,
  451. t.hardwareInfo = this._extraStats.hardwareInfo,
  452. t.maxInterFrameTime = this._extraStats.maxInterFrameTime,
  453. t.maxDrawcallTime = this._extraStats.maxDrawcallTime,
  454. t.maxMeshSelectTime = this._extraStats.maxMeshSelectTime,
  455. t.maxAnimationTime = this._extraStats.maxAnimationTime,
  456. t.maxRegisterBeforeRenderTime = this._extraStats.maxRegisterBeforeRenderTime,
  457. t.maxRegisterAfterRenderTime = this._extraStats.maxRegisterAfterRenderTime,
  458. t.maxRenderTargetRenderTime = this._extraStats.maxRenderTargetRenderTime,
  459. this.externalStats && Object.keys(this.externalStats || {}).forEach(o=>{
  460. t[o] = this.externalStats[o]
  461. }
  462. ),
  463. r._aggregatedStats = t,
  464. this.emit("stats", {
  465. stats: t
  466. })
  467. }
  468. }