12 #include <QtGui/QVector3D>
14 #include <OffscreenQmlElement.h>
15 #include <AudioIOStats.h>
16 #include <render/Args.h>
17 #include <shared/QtHelpers.h>
19 #define STATS_PROPERTY(type, name, initialValue) \
20 Q_PROPERTY(type name READ name NOTIFY name##Changed) \
22 type name() { return _##name; }; \
24 type _##name{ initialValue };
458 class Stats :
public QQuickItem {
461 Q_PROPERTY(
bool expanded READ isExpanded WRITE setExpanded NOTIFY expandedChanged)
462 Q_PROPERTY(
bool timingExpanded READ isTimingExpanded NOTIFY timingExpandedChanged)
463 Q_PROPERTY(QString monospaceFont READ monospaceFont CONSTANT)
465 STATS_PROPERTY(
int, serverCount, 0)
467 STATS_PROPERTY(
float, renderrate, 0)
469 STATS_PROPERTY(
float, presentrate, 0)
471 STATS_PROPERTY(
float, stutterrate, 0)
473 STATS_PROPERTY(
int, appdropped, 0)
474 STATS_PROPERTY(
int, longsubmits, 0)
475 STATS_PROPERTY(
int, longrenders, 0)
476 STATS_PROPERTY(
int, longframes, 0)
478 STATS_PROPERTY(
float, presentnewrate, 0)
479 STATS_PROPERTY(
float, presentdroprate, 0)
480 STATS_PROPERTY(
int, gameLoopRate, 0)
481 STATS_PROPERTY(
int, avatarCount, 0)
482 STATS_PROPERTY(
int, refreshRateTarget, 0)
483 STATS_PROPERTY(QString, refreshRateMode, QString())
484 STATS_PROPERTY(QString, refreshRateRegime, QString())
485 STATS_PROPERTY(QString, uxMode, QString())
486 STATS_PROPERTY(
int, heroAvatarCount, 0)
487 STATS_PROPERTY(
int, physicsObjectCount, 0)
488 STATS_PROPERTY(
int, updatedAvatarCount, 0)
489 STATS_PROPERTY(
int, updatedHeroAvatarCount, 0)
490 STATS_PROPERTY(
int, notUpdatedAvatarCount, 0)
491 STATS_PROPERTY(
int, packetInCount, 0)
492 STATS_PROPERTY(
int, packetOutCount, 0)
493 STATS_PROPERTY(
float, mbpsIn, 0)
494 STATS_PROPERTY(
float, mbpsOut, 0)
495 STATS_PROPERTY(
float, assetMbpsIn, 0)
496 STATS_PROPERTY(
float, assetMbpsOut, 0)
497 STATS_PROPERTY(
int, audioPing, 0)
498 STATS_PROPERTY(
int, avatarPing, 0)
499 STATS_PROPERTY(
int, entitiesPing, 0)
500 STATS_PROPERTY(
int, assetPing, 0)
501 STATS_PROPERTY(
int, messagePing, 0)
502 STATS_PROPERTY(QVector3D, position, QVector3D(0, 0, 0))
503 STATS_PROPERTY(
float, speed, 0)
504 STATS_PROPERTY(
float, yaw, 0)
505 STATS_PROPERTY(
int, avatarMixerInKbps, 0)
506 STATS_PROPERTY(
int, avatarMixerInPps, 0)
507 STATS_PROPERTY(
int, avatarMixerOutKbps, 0)
508 STATS_PROPERTY(
int, avatarMixerOutPps, 0)
509 STATS_PROPERTY(
float, myAvatarSendRate, 0)
511 STATS_PROPERTY(
int, audioMixerInKbps, 0)
512 STATS_PROPERTY(
int, audioMixerInPps, 0)
513 STATS_PROPERTY(
int, audioMixerOutKbps, 0)
514 STATS_PROPERTY(
int, audioMixerOutPps, 0)
515 STATS_PROPERTY(
int, audioMixerKbps, 0)
516 STATS_PROPERTY(
int, audioMixerPps, 0)
517 STATS_PROPERTY(
int, audioOutboundPPS, 0)
518 STATS_PROPERTY(
int, audioSilentOutboundPPS, 0)
519 STATS_PROPERTY(
int, audioInboundPPS, 0)
520 STATS_PROPERTY(
int, audioAudioInboundPPS, 0)
521 STATS_PROPERTY(
int, audioSilentInboundPPS, 0)
522 STATS_PROPERTY(
int, audioPacketLoss, 0)
523 STATS_PROPERTY(QString, audioCodec, QString())
524 STATS_PROPERTY(QString, audioNoiseGate, QString())
525 STATS_PROPERTY(QVector2D, audioInjectors, QVector2D());
526 STATS_PROPERTY(
int, entityPacketsInKbps, 0)
528 STATS_PROPERTY(
int, downloads, 0)
529 STATS_PROPERTY(
int, downloadLimit, 0)
530 STATS_PROPERTY(
int, downloadsPending, 0)
531 Q_PROPERTY(QStringList downloadUrls READ downloadUrls NOTIFY downloadUrlsChanged)
532 STATS_PROPERTY(
int, processing, 0)
533 STATS_PROPERTY(
int, processingPending, 0)
534 STATS_PROPERTY(
int, triangles, 0)
535 STATS_PROPERTY(quint32 , drawcalls, 0)
536 STATS_PROPERTY(
int, materialSwitches, 0)
537 STATS_PROPERTY(
int, itemConsidered, 0)
538 STATS_PROPERTY(
int, itemOutOfView, 0)
539 STATS_PROPERTY(
int, itemTooSmall, 0)
540 STATS_PROPERTY(
int, itemRendered, 0)
541 STATS_PROPERTY(
int, shadowConsidered, 0)
542 STATS_PROPERTY(
int, shadowOutOfView, 0)
543 STATS_PROPERTY(
int, shadowTooSmall, 0)
544 STATS_PROPERTY(
int, shadowRendered, 0)
545 STATS_PROPERTY(QString, sendingMode, QString())
546 STATS_PROPERTY(QString, packetStats, QString())
547 STATS_PROPERTY(
int, lodAngle, 0)
548 STATS_PROPERTY(
int, lodTargetFramerate, 0)
549 STATS_PROPERTY(QString, lodStatus, QString())
550 STATS_PROPERTY(quint64, numEntityUpdates, 0)
551 STATS_PROPERTY(quint64, numNeededEntityUpdates, 0)
552 STATS_PROPERTY(QString, timingStats, QString())
553 STATS_PROPERTY(QString, gameUpdateStats, QString())
554 STATS_PROPERTY(
int, serverElements, 0)
555 STATS_PROPERTY(
int, serverInternal, 0)
556 STATS_PROPERTY(
int, serverLeaves, 0)
557 STATS_PROPERTY(
int, localElements, 0)
558 STATS_PROPERTY(
int, localInternal, 0)
559 STATS_PROPERTY(
int, localLeaves, 0)
560 STATS_PROPERTY(
int, rectifiedTextureCount, 0)
561 STATS_PROPERTY(
int, decimatedTextureCount, 0)
563 STATS_PROPERTY(
int, gpuBuffers, 0)
564 STATS_PROPERTY(
int, gpuBufferMemory, 0)
565 STATS_PROPERTY(
int, gpuTextures, 0)
566 STATS_PROPERTY(
int, glContextSwapchainMemory, 0)
567 STATS_PROPERTY(
int, qmlTextureMemory, 0)
568 STATS_PROPERTY(
int, texturePendingTransfers, 0)
569 STATS_PROPERTY(
int, gpuTextureMemory, 0)
570 STATS_PROPERTY(
int, gpuTextureResidentMemory, 0)
571 STATS_PROPERTY(
int, gpuTextureFramebufferMemory, 0)
572 STATS_PROPERTY(
int, gpuTextureResourceMemory, 0)
573 STATS_PROPERTY(
int, gpuTextureResourceIdealMemory, 0)
574 STATS_PROPERTY(
int, gpuTextureResourcePopulatedMemory, 0)
575 STATS_PROPERTY(
int, gpuTextureExternalMemory, 0)
576 STATS_PROPERTY(QString, gpuTextureMemoryPressureState, QString())
577 STATS_PROPERTY(
int, gpuFreeMemory, 0)
578 STATS_PROPERTY(QVector2D, gpuFrameSize, QVector2D(0,0))
579 STATS_PROPERTY(
float, gpuFrameTime, 0)
580 STATS_PROPERTY(
float, gpuFrameTimePerPixel, 0)
581 STATS_PROPERTY(
float, batchFrameTime, 0)
582 STATS_PROPERTY(
float, engineFrameTime, 0)
583 STATS_PROPERTY(
float, avatarSimulationTime, 0)
585 STATS_PROPERTY(
int, stylusPicksCount, 0)
586 STATS_PROPERTY(
int, rayPicksCount, 0)
587 STATS_PROPERTY(
int, parabolaPicksCount, 0)
588 STATS_PROPERTY(
int, collisionPicksCount, 0)
589 STATS_PROPERTY(QVector3D, stylusPicksUpdated, QVector3D(0, 0, 0))
590 STATS_PROPERTY(QVector3D, rayPicksUpdated, QVector3D(0, 0, 0))
591 STATS_PROPERTY(QVector3D, parabolaPicksUpdated, QVector3D(0, 0, 0))
592 STATS_PROPERTY(QVector3D, collisionPicksUpdated, QVector3D(0, 0, 0))
594 STATS_PROPERTY(
int, mainThreadQueueDepth, -1);
595 STATS_PROPERTY(
int, nodeListThreadQueueDepth, -1);
597 #ifdef DEBUG_EVENT_QUEUE
598 STATS_PROPERTY(
bool, eventQueueDebuggingOn,
true)
600 STATS_PROPERTY(
bool, eventQueueDebuggingOn,
false)
604 static Stats* getInstance();
606 Stats(QQuickItem* parent =
nullptr);
607 bool includeTimingRecord(
const QString& name);
608 void setRenderDetails(
const render::RenderDetails& details);
609 const QString& monospaceFont() {
610 return _monospaceFont;
613 void updateStats(
bool force =
false);
615 bool isExpanded() {
return _expanded; }
616 bool isTimingExpanded() {
return _showTimingDetails; }
618 void setExpanded(
bool expanded) {
619 if (_expanded != expanded) {
620 _expanded = expanded;
621 emit expandedChanged();
625 QStringList downloadUrls () {
return _downloadUrls; }
652 void forceUpdateStats() { updateStats(
true); }
663 void expandedChanged();
670 void timingExpandedChanged();
677 void serverCountChanged();
684 void renderrateChanged();
691 void presentrateChanged();
698 void stutterrateChanged();
705 void appdroppedChanged();
712 void longsubmitsChanged();
719 void longrendersChanged();
726 void longframesChanged();
733 void presentnewrateChanged();
740 void presentdroprateChanged();
747 void gameLoopRateChanged();
754 void avatarCountChanged();
761 void refreshRateTargetChanged();
768 void refreshRateModeChanged();
775 void refreshRateRegimeChanged();
782 void uxModeChanged();
789 void heroAvatarCountChanged();
796 void physicsObjectCountChanged();
803 void updatedAvatarCountChanged();
810 void updatedHeroAvatarCountChanged();
817 void notUpdatedAvatarCountChanged();
824 void packetInCountChanged();
831 void packetOutCountChanged();
838 void mbpsInChanged();
845 void mbpsOutChanged();
852 void assetMbpsInChanged();
859 void assetMbpsOutChanged();
866 void audioPingChanged();
873 void avatarPingChanged();
880 void entitiesPingChanged();
887 void assetPingChanged();
894 void messagePingChanged();
901 void positionChanged();
922 void avatarMixerInKbpsChanged();
929 void avatarMixerInPpsChanged();
936 void avatarMixerOutKbpsChanged();
943 void avatarMixerOutPpsChanged();
950 void myAvatarSendRateChanged();
957 void audioMixerInKbpsChanged();
964 void audioMixerInPpsChanged();
971 void audioMixerOutKbpsChanged();
978 void audioMixerOutPpsChanged();
985 void audioMixerKbpsChanged();
992 void audioMixerPpsChanged();
999 void audioOutboundPPSChanged();
1006 void audioSilentOutboundPPSChanged();
1013 void audioInboundPPSChanged();
1022 void audioAudioInboundPPSChanged();
1029 void audioSilentInboundPPSChanged();
1036 void audioPacketLossChanged();
1043 void audioCodecChanged();
1050 void audioNoiseGateChanged();
1057 void audioInjectorsChanged();
1064 void entityPacketsInKbpsChanged();
1071 void downloadsChanged();
1078 void downloadLimitChanged();
1085 void downloadsPendingChanged();
1092 void downloadUrlsChanged();
1099 void processingChanged();
1106 void processingPendingChanged();
1113 void trianglesChanged();
1120 void drawcallsChanged();
1127 void materialSwitchesChanged();
1134 void itemConsideredChanged();
1141 void itemOutOfViewChanged();
1148 void itemTooSmallChanged();
1155 void itemRenderedChanged();
1162 void shadowConsideredChanged();
1169 void shadowOutOfViewChanged();
1176 void shadowTooSmallChanged();
1183 void shadowRenderedChanged();
1190 void sendingModeChanged();
1197 void packetStatsChanged();
1204 void lodAngleChanged();
1211 void lodTargetFramerateChanged();
1218 void lodStatusChanged();
1225 void numEntityUpdatesChanged();
1232 void numNeededEntityUpdatesChanged();
1239 void timingStatsChanged();
1246 void gameUpdateStatsChanged();
1253 void serverElementsChanged();
1260 void serverInternalChanged();
1267 void serverLeavesChanged();
1274 void localElementsChanged();
1281 void localInternalChanged();
1288 void localLeavesChanged();
1295 void rectifiedTextureCountChanged();
1302 void decimatedTextureCountChanged();
1309 void gpuBuffersChanged();
1316 void gpuBufferMemoryChanged();
1323 void gpuTexturesChanged();
1330 void glContextSwapchainMemoryChanged();
1337 void qmlTextureMemoryChanged();
1344 void texturePendingTransfersChanged();
1351 void gpuTextureMemoryChanged();
1358 void gpuTextureResidentMemoryChanged();
1365 void gpuTextureFramebufferMemoryChanged();
1372 void gpuTextureResourceMemoryChanged();
1379 void gpuTextureResourceIdealMemoryChanged();
1386 void gpuTextureResourcePopulatedMemoryChanged();
1393 void gpuTextureExternalMemoryChanged();
1400 void gpuTextureMemoryPressureStateChanged();
1407 void gpuFreeMemoryChanged();
1414 void gpuFrameSizeChanged();
1421 void gpuFrameTimeChanged();
1428 void gpuFrameTimePerPixelChanged();
1435 void batchFrameTimeChanged();
1442 void engineFrameTimeChanged();
1449 void avatarSimulationTimeChanged();
1456 void stylusPicksCountChanged();
1463 void rayPicksCountChanged();
1470 void parabolaPicksCountChanged();
1477 void collisionPicksCountChanged();
1484 void stylusPicksUpdatedChanged();
1491 void rayPicksUpdatedChanged();
1498 void parabolaPicksUpdatedChanged();
1505 void collisionPicksUpdatedChanged();
1512 void mainThreadQueueDepthChanged();
1519 void nodeListThreadQueueDepthChanged();
1526 void eventQueueDebuggingOnChanged();
1812 int _recentMaxPackets{ 0 } ;
1813 bool _resetRecentMaxPacketsSoon{
true };
1814 bool _expanded{
false };
1815 bool _showTimingDetails{
false };
1816 bool _showGameUpdateStats{
false };
1817 QString _monospaceFont;
1818 const AudioIOStats* _audioStats;
1819 QStringList _downloadUrls = QStringList();