// // Created by Bradley Austin Davis 2015/06/17 // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #ifndef hifi_Stats_h #define hifi_Stats_h #include #include #include #include #define STATS_PROPERTY(type, name, initialValue) \ Q_PROPERTY(type name READ name NOTIFY name##Changed) \ public: \ type name() { return _##name; }; \ private: \ type _##name{ initialValue }; class Stats : public QQuickItem { Q_OBJECT HIFI_QML_DECL Q_PROPERTY(bool expanded READ isExpanded WRITE setExpanded NOTIFY expandedChanged) Q_PROPERTY(bool timingExpanded READ isTimingExpanded NOTIFY timingExpandedChanged) Q_PROPERTY(QString monospaceFont READ monospaceFont CONSTANT) STATS_PROPERTY(int, serverCount, 0) // How often the app is creating new gpu::Frames STATS_PROPERTY(float, renderrate, 0) // How often the display plugin is presenting to the device STATS_PROPERTY(float, presentrate, 0) // How often the display device reprojecting old frames STATS_PROPERTY(float, stutterrate, 0) STATS_PROPERTY(int, appdropped, 0) STATS_PROPERTY(int, longsubmits, 0) STATS_PROPERTY(int, longrenders, 0) STATS_PROPERTY(int, longframes, 0) STATS_PROPERTY(float, presentnewrate, 0) STATS_PROPERTY(float, presentdroprate, 0) STATS_PROPERTY(int, gameLoopRate, 0) STATS_PROPERTY(int, avatarCount, 0) STATS_PROPERTY(int, updatedAvatarCount, 0) STATS_PROPERTY(int, notUpdatedAvatarCount, 0) STATS_PROPERTY(int, packetInCount, 0) STATS_PROPERTY(int, packetOutCount, 0) STATS_PROPERTY(float, mbpsIn, 0) STATS_PROPERTY(float, mbpsOut, 0) STATS_PROPERTY(float, assetMbpsIn, 0) STATS_PROPERTY(float, assetMbpsOut, 0) STATS_PROPERTY(int, audioPing, 0) STATS_PROPERTY(int, avatarPing, 0) STATS_PROPERTY(int, entitiesPing, 0) STATS_PROPERTY(int, assetPing, 0) STATS_PROPERTY(int, messagePing, 0) STATS_PROPERTY(QVector3D, position, QVector3D(0, 0, 0)) STATS_PROPERTY(float, speed, 0) STATS_PROPERTY(float, yaw, 0) STATS_PROPERTY(int, avatarMixerInKbps, 0) STATS_PROPERTY(int, avatarMixerInPps, 0) STATS_PROPERTY(int, avatarMixerOutKbps, 0) STATS_PROPERTY(int, avatarMixerOutPps, 0) STATS_PROPERTY(float, myAvatarSendRate, 0) STATS_PROPERTY(int, audioMixerInKbps, 0) STATS_PROPERTY(int, audioMixerInPps, 0) STATS_PROPERTY(int, audioMixerOutKbps, 0) STATS_PROPERTY(int, audioMixerOutPps, 0) STATS_PROPERTY(int, audioMixerKbps, 0) STATS_PROPERTY(int, audioMixerPps, 0) STATS_PROPERTY(int, audioOutboundPPS, 0) STATS_PROPERTY(int, audioSilentOutboundPPS, 0) STATS_PROPERTY(int, audioAudioInboundPPS, 0) STATS_PROPERTY(int, audioSilentInboundPPS, 0) STATS_PROPERTY(int, audioPacketLoss, 0) STATS_PROPERTY(QString, audioCodec, QString()) STATS_PROPERTY(QString, audioNoiseGate, QString()) STATS_PROPERTY(int, entityPacketsInKbps, 0) STATS_PROPERTY(int, downloads, 0) STATS_PROPERTY(int, downloadLimit, 0) STATS_PROPERTY(int, downloadsPending, 0) Q_PROPERTY(QStringList downloadUrls READ downloadUrls NOTIFY downloadUrlsChanged) STATS_PROPERTY(int, processing, 0) STATS_PROPERTY(int, processingPending, 0) STATS_PROPERTY(int, triangles, 0) STATS_PROPERTY(int, quads, 0) STATS_PROPERTY(int, materialSwitches, 0) STATS_PROPERTY(int, itemConsidered, 0) STATS_PROPERTY(int, itemOutOfView, 0) STATS_PROPERTY(int, itemTooSmall, 0) STATS_PROPERTY(int, itemRendered, 0) STATS_PROPERTY(int, shadowConsidered, 0) STATS_PROPERTY(int, shadowOutOfView, 0) STATS_PROPERTY(int, shadowTooSmall, 0) STATS_PROPERTY(int, shadowRendered, 0) STATS_PROPERTY(QString, sendingMode, QString()) STATS_PROPERTY(QString, packetStats, QString()) STATS_PROPERTY(QString, lodStatus, QString()) STATS_PROPERTY(QString, timingStats, QString()) STATS_PROPERTY(QString, gameUpdateStats, QString()) STATS_PROPERTY(int, serverElements, 0) STATS_PROPERTY(int, serverInternal, 0) STATS_PROPERTY(int, serverLeaves, 0) STATS_PROPERTY(int, localElements, 0) STATS_PROPERTY(int, localInternal, 0) STATS_PROPERTY(int, localLeaves, 0) STATS_PROPERTY(int, rectifiedTextureCount, 0) STATS_PROPERTY(int, decimatedTextureCount, 0) STATS_PROPERTY(int, gpuBuffers, 0) STATS_PROPERTY(int, gpuBufferMemory, 0) STATS_PROPERTY(int, gpuTextures, 0) STATS_PROPERTY(int, glContextSwapchainMemory, 0) STATS_PROPERTY(int, qmlTextureMemory, 0) STATS_PROPERTY(int, texturePendingTransfers, 0) STATS_PROPERTY(int, gpuTextureMemory, 0) STATS_PROPERTY(int, gpuTextureResidentMemory, 0) STATS_PROPERTY(int, gpuTextureFramebufferMemory, 0) STATS_PROPERTY(int, gpuTextureResourceMemory, 0) STATS_PROPERTY(int, gpuTextureResourcePopulatedMemory, 0) STATS_PROPERTY(int, gpuTextureExternalMemory, 0) STATS_PROPERTY(QString, gpuTextureMemoryPressureState, QString()) STATS_PROPERTY(int, gpuFreeMemory, 0) STATS_PROPERTY(float, gpuFrameTime, 0) STATS_PROPERTY(float, batchFrameTime, 0) STATS_PROPERTY(float, engineFrameTime, 0) STATS_PROPERTY(float, avatarSimulationTime, 0) public: static Stats* getInstance(); Stats(QQuickItem* parent = nullptr); bool includeTimingRecord(const QString& name); void setRenderDetails(const render::RenderDetails& details); const QString& monospaceFont() { return _monospaceFont; } void updateStats(bool force = false); bool isExpanded() { return _expanded; } bool isTimingExpanded() { return _showTimingDetails; } void setExpanded(bool expanded) { if (_expanded != expanded) { _expanded = expanded; emit expandedChanged(); } } QStringList downloadUrls () { return _downloadUrls; } public slots: void forceUpdateStats() { updateStats(true); } signals: void longsubmitsChanged(); void longrendersChanged(); void longframesChanged(); void appdroppedChanged(); void expandedChanged(); void timingExpandedChanged(); void serverCountChanged(); void renderrateChanged(); void presentrateChanged(); void presentnewrateChanged(); void presentdroprateChanged(); void stutterrateChanged(); void gameLoopRateChanged(); void avatarCountChanged(); void updatedAvatarCountChanged(); void notUpdatedAvatarCountChanged(); void packetInCountChanged(); void packetOutCountChanged(); void mbpsInChanged(); void mbpsOutChanged(); void assetMbpsInChanged(); void assetMbpsOutChanged(); void audioPingChanged(); void avatarPingChanged(); void entitiesPingChanged(); void assetPingChanged(); void messagePingChanged(); void positionChanged(); void speedChanged(); void yawChanged(); void avatarMixerInKbpsChanged(); void avatarMixerInPpsChanged(); void avatarMixerOutKbpsChanged(); void avatarMixerOutPpsChanged(); void myAvatarSendRateChanged(); void audioMixerInKbpsChanged(); void audioMixerInPpsChanged(); void audioMixerOutKbpsChanged(); void audioMixerOutPpsChanged(); void audioMixerKbpsChanged(); void audioMixerPpsChanged(); void audioOutboundPPSChanged(); void audioSilentOutboundPPSChanged(); void audioAudioInboundPPSChanged(); void audioSilentInboundPPSChanged(); void audioPacketLossChanged(); void audioCodecChanged(); void audioNoiseGateChanged(); void entityPacketsInKbpsChanged(); void downloadsChanged(); void downloadLimitChanged(); void downloadsPendingChanged(); void downloadUrlsChanged(); void processingChanged(); void processingPendingChanged(); void trianglesChanged(); void quadsChanged(); void materialSwitchesChanged(); void itemConsideredChanged(); void itemOutOfViewChanged(); void itemTooSmallChanged(); void itemRenderedChanged(); void shadowConsideredChanged(); void shadowOutOfViewChanged(); void shadowTooSmallChanged(); void shadowRenderedChanged(); void sendingModeChanged(); void packetStatsChanged(); void lodStatusChanged(); void serverElementsChanged(); void serverInternalChanged(); void serverLeavesChanged(); void localElementsChanged(); void localInternalChanged(); void localLeavesChanged(); void timingStatsChanged(); void gameUpdateStatsChanged(); void glContextSwapchainMemoryChanged(); void qmlTextureMemoryChanged(); void texturePendingTransfersChanged(); void gpuBuffersChanged(); void gpuBufferMemoryChanged(); void gpuTexturesChanged(); void gpuTextureMemoryChanged(); void gpuTextureResidentMemoryChanged(); void gpuTextureFramebufferMemoryChanged(); void gpuTextureResourceMemoryChanged(); void gpuTextureResourcePopulatedMemoryChanged(); void gpuTextureExternalMemoryChanged(); void gpuTextureMemoryPressureStateChanged(); void gpuFreeMemoryChanged(); void gpuFrameTimeChanged(); void batchFrameTimeChanged(); void engineFrameTimeChanged(); void avatarSimulationTimeChanged(); void rectifiedTextureCountChanged(); void decimatedTextureCountChanged(); private: int _recentMaxPackets{ 0 } ; // recent max incoming voxel packets to process bool _resetRecentMaxPacketsSoon{ true }; bool _expanded{ false }; bool _showTimingDetails{ false }; bool _showGameUpdateStats{ false }; QString _monospaceFont; const AudioIOStats* _audioStats; QStringList _downloadUrls = QStringList(); }; #endif // hifi_Stats_h