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