From 2d9a7f7c4f5db71ea7b9b555ca87d621cc38baa6 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 7 Jun 2019 17:00:37 -0700 Subject: [PATCH] Refined the capping of the LOD Target Rate to be the lower REfreshrate when FOcus-inactive, this prevent the panic attacks of the LOD system on low end hardware --- .../qml/+android_interface/Stats.qml | 3 + interface/resources/qml/Stats.qml | 61 ++++++++++--------- interface/src/LODManager.cpp | 13 +++- interface/src/PerformanceManager.cpp | 5 +- interface/src/RefreshRateManager.cpp | 23 ++++--- interface/src/RefreshRateManager.h | 3 + interface/src/ui/Stats.cpp | 2 + interface/src/ui/Stats.h | 18 ++++++ .../src/platform/backend/MACOSPlatform.cpp | 15 +++-- 9 files changed, 94 insertions(+), 49 deletions(-) diff --git a/interface/resources/qml/+android_interface/Stats.qml b/interface/resources/qml/+android_interface/Stats.qml index 54f6086a86..1f07af786f 100644 --- a/interface/resources/qml/+android_interface/Stats.qml +++ b/interface/resources/qml/+android_interface/Stats.qml @@ -269,6 +269,9 @@ Item { StatText { text: "GPU: " + root.gpuFrameTime.toFixed(1) + " ms" } + StatText { + text: "LOD Target: " + root.lodTargetFramerate + " Hz Angle: " + root.lodAngle + " deg" + } StatText { text: "Drawcalls: " + root.drawcalls } diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index 5af3ba9168..2c991aa9dd 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -259,6 +259,35 @@ Item { visible: root.expanded; text: "Entity Servers In: " + root.entityPacketsInKbps + " kbps"; } + StatText { + visible: !root.expanded + text: "Octree Elements Server: " + root.serverElements + + " Local: " + root.localElements; + } + StatText { + visible: root.expanded + text: "Octree Sending Mode: " + root.sendingMode; + } + StatText { + visible: root.expanded + text: "Octree Packets to Process: " + root.packetStats; + } + StatText { + visible: root.expanded + text: "Octree Elements - "; + } + StatText { + visible: root.expanded + text: "\tServer: " + root.serverElements + + " Internal: " + root.serverInternal + + " Leaves: " + root.serverLeaves; + } + StatText { + visible: root.expanded + text: "\tLocal: " + root.localElements + + " Internal: " + root.localInternal + + " Leaves: " + root.localLeaves; + } StatText { visible: root.expanded; text: "Downloads: " + root.downloads + "/" + root.downloadLimit + @@ -316,6 +345,9 @@ Item { StatText { text: "GPU frame size: " + root.gpuFrameSize.x + " x " + root.gpuFrameSize.y } + StatText { + text: "LOD Target: " + root.lodTargetFramerate + " Hz Angle: " + root.lodAngle + " deg" + } StatText { text: "Drawcalls: " + root.drawcalls } @@ -401,35 +433,6 @@ Item { text: " out of view: " + root.shadowOutOfView + " too small: " + root.shadowTooSmall; } - StatText { - visible: !root.expanded - text: "Octree Elements Server: " + root.serverElements + - " Local: " + root.localElements; - } - StatText { - visible: root.expanded - text: "Octree Sending Mode: " + root.sendingMode; - } - StatText { - visible: root.expanded - text: "Octree Packets to Process: " + root.packetStats; - } - StatText { - visible: root.expanded - text: "Octree Elements - "; - } - StatText { - visible: root.expanded - text: "\tServer: " + root.serverElements + - " Internal: " + root.serverInternal + - " Leaves: " + root.serverLeaves; - } - StatText { - visible: root.expanded - text: "\tLocal: " + root.localElements + - " Internal: " + root.localInternal + - " Leaves: " + root.localLeaves; - } StatText { visible: root.expanded text: "LOD: " + root.lodStatus; diff --git a/interface/src/LODManager.cpp b/interface/src/LODManager.cpp index b0b919fb0f..0c9587d3ae 100644 --- a/interface/src/LODManager.cpp +++ b/interface/src/LODManager.cpp @@ -351,7 +351,18 @@ float LODManager::getHMDLODTargetFPS() const { } float LODManager::getLODTargetFPS() const { - auto refreshRateFPS = qApp->getRefreshRateManager().getActiveRefreshRate(); + + // Use the current refresh rate as the recommended rate target used to cap the LOD manager control value. + // When focused, Use the Focus Inactive as the targget LOD to void abrupt changes from the lod controller. + auto& refreshRateManager = qApp->getRefreshRateManager(); + auto refreshRateRegime = refreshRateManager.getRefreshRateRegime(); + auto refreshRateProfile = refreshRateManager.getRefreshRateProfile(); + auto refreshRateUXMode = refreshRateManager.getUXMode(); + auto refreshRateFPS = refreshRateManager.getActiveRefreshRate(); + if (refreshRateRegime == RefreshRateManager::RefreshRateRegime::FOCUS_ACTIVE) { + refreshRateFPS = refreshRateManager.queryRefreshRateTarget(refreshRateProfile, RefreshRateManager::RefreshRateRegime::FOCUS_INACTIVE, refreshRateUXMode); + } + auto lodTargetFPS = getDesktopLODTargetFPS(); if (qApp->isHMDMode()) { lodTargetFPS = getHMDLODTargetFPS(); diff --git a/interface/src/PerformanceManager.cpp b/interface/src/PerformanceManager.cpp index 910f42ac6e..cf6da11aeb 100644 --- a/interface/src/PerformanceManager.cpp +++ b/interface/src/PerformanceManager.cpp @@ -69,13 +69,14 @@ void PerformanceManager::applyPerformancePreset(PerformanceManager::PerformanceP RenderScriptingInterface::getInstance()->setShadowsEnabled(true); qApp->getRefreshRateManager().setRefreshRateProfile(RefreshRateManager::RefreshRateProfile::REALTIME); - // DependencyManager::get()->setWorldDetailQuality() + DependencyManager::get()->setWorldDetailQuality(0.5f); break; case PerformancePreset::MID: RenderScriptingInterface::getInstance()->setRenderMethod(RenderScriptingInterface::RenderMethod::DEFERRED); RenderScriptingInterface::getInstance()->setShadowsEnabled(false); qApp->getRefreshRateManager().setRefreshRateProfile(RefreshRateManager::RefreshRateProfile::INTERACTIVE); + DependencyManager::get()->setWorldDetailQuality(0.5f); break; case PerformancePreset::LOW: @@ -83,6 +84,8 @@ void PerformanceManager::applyPerformancePreset(PerformanceManager::PerformanceP RenderScriptingInterface::getInstance()->setShadowsEnabled(false); qApp->getRefreshRateManager().setRefreshRateProfile(RefreshRateManager::RefreshRateProfile::ECO); + DependencyManager::get()->setWorldDetailQuality(0.75f); + break; case PerformancePreset::UNKNOWN: default: diff --git a/interface/src/RefreshRateManager.cpp b/interface/src/RefreshRateManager.cpp index 4963eee8cf..922682d9c0 100644 --- a/interface/src/RefreshRateManager.cpp +++ b/interface/src/RefreshRateManager.cpp @@ -107,9 +107,7 @@ RefreshRateManager::RefreshRateProfile RefreshRateManager::getRefreshRateProfile RefreshRateManager::RefreshRateProfile profile = RefreshRateManager::RefreshRateProfile::REALTIME; if (getUXMode() != RefreshRateManager::UXMode::VR) { - profile =(RefreshRateManager::RefreshRateProfile) _refreshRateProfileSettingLock.resultWithReadLock([&] { - return _refreshRateProfileSetting.get(); - }); + return _refreshRateProfile; } return profile; @@ -138,15 +136,20 @@ void RefreshRateManager::setUXMode(RefreshRateManager::UXMode uxMode) { } } +int RefreshRateManager::queryRefreshRateTarget(RefreshRateProfile profile, RefreshRateRegime regime, UXMode uxMode) const { + int targetRefreshRate; + if (uxMode == RefreshRateManager::UXMode::DESKTOP) { + targetRefreshRate = REFRESH_RATE_PROFILES[profile][regime]; + } + else { + targetRefreshRate = VR_TARGET_RATE; + } + return targetRefreshRate; +} + void RefreshRateManager::updateRefreshRateController() const { if (_refreshRateOperator) { - int targetRefreshRate; - if (_uxMode == RefreshRateManager::UXMode::DESKTOP) { - targetRefreshRate = REFRESH_RATE_PROFILES[_refreshRateProfile][_refreshRateRegime]; - } else { - targetRefreshRate = VR_TARGET_RATE; - } - + int targetRefreshRate = queryRefreshRateTarget(_refreshRateProfile, _refreshRateRegime, _uxMode); _refreshRateOperator(targetRefreshRate); _activeRefreshRate = targetRefreshRate; } diff --git a/interface/src/RefreshRateManager.h b/interface/src/RefreshRateManager.h index 74dd8156e1..567a515898 100644 --- a/interface/src/RefreshRateManager.h +++ b/interface/src/RefreshRateManager.h @@ -65,6 +65,9 @@ public: int getActiveRefreshRate() const { return _activeRefreshRate; } void updateRefreshRateController() const; + // query the refresh rate target at the specified combination + int queryRefreshRateTarget(RefreshRateProfile profile, RefreshRateRegime regime, UXMode uxMode) const; + void resetInactiveTimer(); void toggleInactive(); diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index d243fa9ebf..dc9780adf5 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -416,6 +416,8 @@ void Stats::updateStats(bool force) { gpuContext->getFrameStats(gpuFrameStats); STAT_UPDATE(drawcalls, gpuFrameStats._DSNumDrawcalls); + STAT_UPDATE(lodTargetFramerate, DependencyManager::get()->getLODTargetFPS()); + STAT_UPDATE(lodAngle, DependencyManager::get()->getLODAngleDeg()); // Incoming packets diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index cb13945320..ef4668f85e 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -109,6 +109,8 @@ private: \ * @property {number} shadowRendered - Read-only. * @property {string} sendingMode - Read-only. * @property {string} packetStats - Read-only. + * @property {number} lodAngle - Read-only. + * @property {number} lodTargetFramerate - Read-only. * @property {string} lodStatus - Read-only. * @property {string} timingStats - Read-only. * @property {string} gameUpdateStats - Read-only. @@ -272,6 +274,8 @@ class Stats : public QQuickItem { STATS_PROPERTY(int, shadowRendered, 0) STATS_PROPERTY(QString, sendingMode, QString()) STATS_PROPERTY(QString, packetStats, QString()) + STATS_PROPERTY(int, lodAngle, 0) + STATS_PROPERTY(int, lodTargetFramerate, 0) STATS_PROPERTY(QString, lodStatus, QString()) STATS_PROPERTY(QString, timingStats, QString()) STATS_PROPERTY(QString, gameUpdateStats, QString()) @@ -858,6 +862,20 @@ signals: */ void packetStatsChanged(); + /**jsdoc + * Triggered when the value of the lodAngle property changes. + * @function Stats.lodAngleChanged + * @returns {Signal} + */ + void lodAngleChanged(); + + /**jsdoc + * Triggered when the value of the lodTargetFramerate property changes. + * @function Stats.lodTargetFramerateChanged + * @returns {Signal} + */ + void lodTargetFramerateChanged(); + /**jsdoc * Triggered when the value of the lodStatus property changes. * @function Stats.lodStatusChanged diff --git a/libraries/platform/src/platform/backend/MACOSPlatform.cpp b/libraries/platform/src/platform/backend/MACOSPlatform.cpp index c7ab7c77a0..695c872e90 100644 --- a/libraries/platform/src/platform/backend/MACOSPlatform.cpp +++ b/libraries/platform/src/platform/backend/MACOSPlatform.cpp @@ -102,8 +102,10 @@ void MACOSInstance::enumerateDisplays() { #ifdef Q_OS_MAC auto displayID = CGMainDisplayID(); auto displaySize = CGDisplayScreenSize(displayID); - auto displaySizeWidthInches = displaySize.width * 0.0393701; - auto displaySizeHeightInches = displaySize.height * 0.0393701; + + const auto MM_TO_IN = 0.0393701; + auto displaySizeWidthInches = displaySize.width * MM_TO_IN; + auto displaySizeHeightInches = displaySize.height * MM_TO_IN; auto displaySizeDiagonalInches = sqrt(displaySizeWidthInches * displaySizeWidthInches + displaySizeHeightInches * displaySizeHeightInches); auto displayPixelsWidth= CGDisplayPixelsWide(displayID); @@ -125,12 +127,10 @@ void MACOSInstance::enumerateDisplays() { json display = {}; - // display["physicalWidth"] = displaySizeWidthInches; - // display["physicalHeight"] = displaySizeHeightInches; + display["physicalWidth"] = displaySizeWidthInches; + display["physicalHeight"] = displaySizeHeightInches; display["physicalDiagonal"] = displaySizeDiagonalInches; - // display["ppiH"] = displayModeWidth / displaySizeWidthInches; - // display["ppiV"] = displayModeHeight / displaySizeHeightInches; display["ppi"] = sqrt(displayModeHeight * displayModeHeight + displayModeWidth * displayModeWidth) / displaySizeDiagonalInches; display["coordLeft"] = displayBounds.origin.x; @@ -148,8 +148,7 @@ void MACOSInstance::enumerateDisplays() { display["refreshrate"] =displayRefreshrate; display["modeWidth"] = displayModeWidth; display["modeHeight"] = displayModeHeight; - - + _display.push_back(display); #endif }