Stats.js 23 KB

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