mirror of
https://github.com/overte-org/overte.git
synced 2025-07-23 10:23:59 +02:00
LODManager-centric stats and preferences.
This commit is contained in:
parent
d15da79d90
commit
09d4a06ad4
8 changed files with 46 additions and 30 deletions
|
@ -258,14 +258,14 @@ Item {
|
||||||
Text {
|
Text {
|
||||||
color: root.fontColor;
|
color: root.fontColor;
|
||||||
font.pixelSize: root.fontSize
|
font.pixelSize: root.fontSize
|
||||||
visible: root.expanded
|
visible: root.showAcuity
|
||||||
text: "LOD: " + root.lodStatus;
|
text: "LOD: " + root.lodStatus;
|
||||||
}
|
}
|
||||||
Text {
|
Text {
|
||||||
color: root.fontColor;
|
color: root.fontColor;
|
||||||
font.pixelSize: root.fontSize
|
font.pixelSize: root.fontSize
|
||||||
visible: root.expanded
|
visible: root.expanded
|
||||||
text: "Renderable avatars: " + root.avatarRenderableCount + " w/in " + root.avatarRenderDistance + "m";
|
text: root.lodStatsRenderText;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <avatar/AvatarManager.h>
|
||||||
#include <SettingHandle.h>
|
#include <SettingHandle.h>
|
||||||
#include <Util.h>
|
#include <Util.h>
|
||||||
|
|
||||||
|
@ -21,24 +22,31 @@
|
||||||
Setting::Handle<float> desktopLODDecreaseFPS("desktopLODDecreaseFPS", DEFAULT_DESKTOP_LOD_DOWN_FPS);
|
Setting::Handle<float> desktopLODDecreaseFPS("desktopLODDecreaseFPS", DEFAULT_DESKTOP_LOD_DOWN_FPS);
|
||||||
Setting::Handle<float> hmdLODDecreaseFPS("hmdLODDecreaseFPS", DEFAULT_HMD_LOD_DOWN_FPS);
|
Setting::Handle<float> hmdLODDecreaseFPS("hmdLODDecreaseFPS", DEFAULT_HMD_LOD_DOWN_FPS);
|
||||||
// There are two different systems in use, based on lodPreference:
|
// There are two different systems in use, based on lodPreference:
|
||||||
// pid: renderDistance is automatically adjusted such that frame rate targets are met.
|
// pid: renderDistance is adjusted by a PID such that frame rate targets are met.
|
||||||
// acuity: a pseudo-acuity target is held, or adjusted to match minimum frame rates.
|
// acuity: a pseudo-acuity target is held, or adjusted to match minimum frame rates (and a PID controlls avatar rendering distance)
|
||||||
// If unspecified, acuity is used only if user has specified non-default minumum frame rates.
|
// If unspecified, acuity is used only if user has specified non-default minumum frame rates.
|
||||||
Setting::Handle<int> lodPreference("lodPreference", (int)LODManager::LODPreference::unspecified);
|
Setting::Handle<int> lodPreference("lodPreference", (int)LODManager::LODPreference::unspecified);
|
||||||
|
const float SMALLEST_REASONABLE_HORIZON = 50.0f; // meters
|
||||||
|
Setting::Handle<float> renderDistanceInverseHighLimit("renderDistanceInverseHighLimit", 1.0f / SMALLEST_REASONABLE_HORIZON);
|
||||||
|
void LODManager::setRenderDistanceInverseHighLimit(float newValue) {
|
||||||
|
renderDistanceInverseHighLimit.set(newValue); // persist it, and tell all the controllers that use it
|
||||||
|
_renderDistanceController.setControlledValueHighLimit(newValue);
|
||||||
|
DependencyManager::get<AvatarManager>()->setRenderDistanceInverseHighLimit(newValue);
|
||||||
|
}
|
||||||
|
|
||||||
LODManager::LODManager() {
|
LODManager::LODManager() {
|
||||||
calculateAvatarLODDistanceMultiplier();
|
calculateAvatarLODDistanceMultiplier();
|
||||||
|
|
||||||
_renderDistanceController.setControlledValueHighLimit(20.0f);
|
setRenderDistanceInverseHighLimit(renderDistanceInverseHighLimit.get());
|
||||||
_renderDistanceController.setControlledValueLowLimit(1.0f / (float)TREE_SCALE);
|
setRenderDistanceInverseLowLimit(1.0f / (float)TREE_SCALE);
|
||||||
// Advice for tuning parameters:
|
// Advice for tuning parameters:
|
||||||
// See PIDController.h. There's a section on tuning in the reference.
|
// See PIDController.h. There's a section on tuning in the reference.
|
||||||
// Turn on logging with the following (or from js with AvatarList.setRenderDistanceControllerHistory("avatar render", 300))
|
// Turn on logging with the following (or from js with AvatarList.setRenderDistanceControllerHistory("avatar render", 300))
|
||||||
//_renderDistanceController.setHistorySize("avatar render", target_fps * 4);
|
//_renderDistanceController.setHistorySize("avatar render", target_fps * 4);
|
||||||
// Note that extra logging/hysteresis is turned off in Avatar.cpp when the above logging is on.
|
// Note that extra logging/hysteresis is turned off in Avatar.cpp when the above logging is on.
|
||||||
_renderDistanceController.setKP(0.000012f); // Usually about 0.6 of largest that doesn't oscillate when other parameters 0.
|
setRenderDistanceKP(0.000012f); // Usually about 0.6 of largest that doesn't oscillate when other parameters 0.
|
||||||
_renderDistanceController.setKI(0.00002f); // Big enough to bring us to target with the above KP.
|
setRenderDistanceKI(0.00002f); // Big enough to bring us to target with the above KP.
|
||||||
_renderDistanceController.setHistorySize("FIXME", 240);
|
//setRenderDistanceControllerHistory("FIXME", 240);
|
||||||
}
|
}
|
||||||
|
|
||||||
float LODManager::getLODDecreaseFPS() {
|
float LODManager::getLODDecreaseFPS() {
|
||||||
|
@ -243,6 +251,14 @@ float LODManager::getRenderDistance() {
|
||||||
int LODManager::getRenderedCount() {
|
int LODManager::getRenderedCount() {
|
||||||
return lastRenderedCount;
|
return lastRenderedCount;
|
||||||
}
|
}
|
||||||
|
QString LODManager::getLODStatsRenderText() {
|
||||||
|
if (getUseAcuity()) {
|
||||||
|
auto avatarManager = DependencyManager::get<AvatarManager>();
|
||||||
|
return QString("Renderable avatars: ") + QString::number(avatarManager->getNumberInRenderRange()) + " w/in " + QString::number((int)avatarManager->getRenderDistance()) + "m";
|
||||||
|
} else {
|
||||||
|
return QString("Rendered objects: ") + QString::number(getRenderedCount()) + " w/in " + QString::number((int)getRenderDistance()) + "m";
|
||||||
|
}
|
||||||
|
}
|
||||||
// compare audoAdjustLOD()
|
// compare audoAdjustLOD()
|
||||||
void LODManager::updatePIDRenderDistance(float targetFps, float measuredFps, float deltaTime, bool isThrottled) {
|
void LODManager::updatePIDRenderDistance(float targetFps, float measuredFps, float deltaTime, bool isThrottled) {
|
||||||
float distance;
|
float distance;
|
||||||
|
|
|
@ -89,16 +89,19 @@ public:
|
||||||
};
|
};
|
||||||
static bool getUseAcuity();
|
static bool getUseAcuity();
|
||||||
static void setUseAcuity(bool newValue);
|
static void setUseAcuity(bool newValue);
|
||||||
Q_INVOKABLE bool getRenderDistanceControllerIsLogging() { return _renderDistanceController.getIsLogging(); }
|
|
||||||
Q_INVOKABLE void setRenderDistanceControllerHistory(QString label, int size) { return _renderDistanceController.setHistorySize(label, size); }
|
|
||||||
Q_INVOKABLE void setRenderDistanceKP(float newValue) { _renderDistanceController.setKP(newValue); }
|
Q_INVOKABLE void setRenderDistanceKP(float newValue) { _renderDistanceController.setKP(newValue); }
|
||||||
Q_INVOKABLE void setRenderDistanceKI(float newValue) { _renderDistanceController.setKI(newValue); }
|
Q_INVOKABLE void setRenderDistanceKI(float newValue) { _renderDistanceController.setKI(newValue); }
|
||||||
Q_INVOKABLE void setRenderDistanceKD(float newValue) { _renderDistanceController.setKD(newValue); }
|
Q_INVOKABLE void setRenderDistanceKD(float newValue) { _renderDistanceController.setKD(newValue); }
|
||||||
|
Q_INVOKABLE bool getRenderDistanceControllerIsLogging() { return _renderDistanceController.getIsLogging(); }
|
||||||
|
Q_INVOKABLE void setRenderDistanceControllerHistory(QString label, int size) { return _renderDistanceController.setHistorySize(label, size); }
|
||||||
|
Q_INVOKABLE float getRenderDistanceInverseLowLimit() { return _renderDistanceController.getControlledValueLowLimit(); }
|
||||||
Q_INVOKABLE void setRenderDistanceInverseLowLimit(float newValue) { _renderDistanceController.setControlledValueLowLimit(newValue); }
|
Q_INVOKABLE void setRenderDistanceInverseLowLimit(float newValue) { _renderDistanceController.setControlledValueLowLimit(newValue); }
|
||||||
Q_INVOKABLE void setRenderDistanceInverseHighLimit(float newValue) { _renderDistanceController.setControlledValueHighLimit(newValue); }
|
Q_INVOKABLE float getRenderDistanceInverseHighLimit() { return _renderDistanceController.getControlledValueHighLimit(); }
|
||||||
|
Q_INVOKABLE void setRenderDistanceInverseHighLimit(float newValue);
|
||||||
void updatePIDRenderDistance(float targetFps, float measuredFps, float deltaTime, bool isThrottled);
|
void updatePIDRenderDistance(float targetFps, float measuredFps, float deltaTime, bool isThrottled);
|
||||||
float getRenderDistance();
|
float getRenderDistance();
|
||||||
int getRenderedCount();
|
int getRenderedCount();
|
||||||
|
QString getLODStatsRenderText();
|
||||||
|
|
||||||
static bool shouldRender(const RenderArgs* args, const AABox& bounds);
|
static bool shouldRender(const RenderArgs* args, const AABox& bounds);
|
||||||
bool shouldRenderMesh(float largestDimension, float distanceToCamera);
|
bool shouldRenderMesh(float largestDimension, float distanceToCamera);
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
#include "Avatar.h"
|
#include "Avatar.h"
|
||||||
#include "AvatarManager.h"
|
#include "AvatarManager.h"
|
||||||
|
#include "LODManager.h"
|
||||||
#include "Menu.h"
|
#include "Menu.h"
|
||||||
#include "MyAvatar.h"
|
#include "MyAvatar.h"
|
||||||
#include "SceneScriptingInterface.h"
|
#include "SceneScriptingInterface.h"
|
||||||
|
@ -76,13 +77,6 @@ AvatarManager::AvatarManager(QObject* parent) :
|
||||||
packetReceiver.registerListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket");
|
packetReceiver.registerListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket");
|
||||||
}
|
}
|
||||||
|
|
||||||
const float SMALLEST_REASONABLE_HORIZON = 5.0f; // meters
|
|
||||||
Setting::Handle<float> avatarRenderDistanceInverseHighLimit("avatarRenderDistanceHighLimit", 1.0f / SMALLEST_REASONABLE_HORIZON);
|
|
||||||
void AvatarManager::setRenderDistanceInverseHighLimit(float newValue) {
|
|
||||||
avatarRenderDistanceInverseHighLimit.set(newValue);
|
|
||||||
_renderDistanceController.setControlledValueHighLimit(newValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AvatarManager::init() {
|
void AvatarManager::init() {
|
||||||
_myAvatar->init();
|
_myAvatar->init();
|
||||||
{
|
{
|
||||||
|
@ -100,8 +94,8 @@ void AvatarManager::init() {
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
|
|
||||||
const float target_fps = qApp->getTargetFrameRate();
|
const float target_fps = qApp->getTargetFrameRate();
|
||||||
_renderDistanceController.setMeasuredValueSetpoint(target_fps);
|
_renderDistanceController.setMeasuredValueSetpoint(target_fps / 2.0f);
|
||||||
_renderDistanceController.setControlledValueHighLimit(avatarRenderDistanceInverseHighLimit.get());
|
_renderDistanceController.setControlledValueHighLimit(DependencyManager::get<LODManager>()->getRenderDistanceInverseHighLimit());
|
||||||
_renderDistanceController.setControlledValueLowLimit(1.0f / (float) TREE_SCALE);
|
_renderDistanceController.setControlledValueLowLimit(1.0f / (float) TREE_SCALE);
|
||||||
// Advice for tuning parameters:
|
// Advice for tuning parameters:
|
||||||
// See PIDController.h. There's a section on tuning in the reference.
|
// See PIDController.h. There's a section on tuning in the reference.
|
||||||
|
|
|
@ -79,7 +79,7 @@ public:
|
||||||
Q_INVOKABLE void setRenderDistanceKI(float newValue) { _renderDistanceController.setKI(newValue); }
|
Q_INVOKABLE void setRenderDistanceKI(float newValue) { _renderDistanceController.setKI(newValue); }
|
||||||
Q_INVOKABLE void setRenderDistanceKD(float newValue) { _renderDistanceController.setKD(newValue); }
|
Q_INVOKABLE void setRenderDistanceKD(float newValue) { _renderDistanceController.setKD(newValue); }
|
||||||
Q_INVOKABLE void setRenderDistanceInverseLowLimit(float newValue) { _renderDistanceController.setControlledValueLowLimit(newValue); }
|
Q_INVOKABLE void setRenderDistanceInverseLowLimit(float newValue) { _renderDistanceController.setControlledValueLowLimit(newValue); }
|
||||||
Q_INVOKABLE void setRenderDistanceInverseHighLimit(float newValue);
|
Q_INVOKABLE void setRenderDistanceInverseHighLimit(float newValue) { _renderDistanceController.setControlledValueHighLimit(newValue); }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setShouldShowReceiveStats(bool shouldShowReceiveStats) { _shouldShowReceiveStats = shouldShowReceiveStats; }
|
void setShouldShowReceiveStats(bool shouldShowReceiveStats) { _shouldShowReceiveStats = shouldShowReceiveStats; }
|
||||||
|
|
|
@ -225,7 +225,7 @@ void PreferencesDialog::loadPreferences() {
|
||||||
ui.useAcuityCheckBox->setChecked(lodManager->getUseAcuity());
|
ui.useAcuityCheckBox->setChecked(lodManager->getUseAcuity());
|
||||||
ui.desktopMinimumFPSSpin->setValue(lodManager->getDesktopLODDecreaseFPS());
|
ui.desktopMinimumFPSSpin->setValue(lodManager->getDesktopLODDecreaseFPS());
|
||||||
ui.hmdMinimumFPSSpin->setValue(lodManager->getHMDLODDecreaseFPS());
|
ui.hmdMinimumFPSSpin->setValue(lodManager->getHMDLODDecreaseFPS());
|
||||||
ui.smallestReasonableRenderHorizon->setValue(1.0f / DependencyManager::get<AvatarManager>()->getRenderDistanceInverseHighLimit());
|
ui.smallestReasonableRenderHorizon->setValue(1.0f / lodManager->getRenderDistanceInverseHighLimit());
|
||||||
changeUseAcuity();
|
changeUseAcuity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,5 +318,5 @@ void PreferencesDialog::savePreferences() {
|
||||||
lodManager->setUseAcuity(ui.useAcuityCheckBox->isChecked());
|
lodManager->setUseAcuity(ui.useAcuityCheckBox->isChecked());
|
||||||
lodManager->setDesktopLODDecreaseFPS(ui.desktopMinimumFPSSpin->value());
|
lodManager->setDesktopLODDecreaseFPS(ui.desktopMinimumFPSSpin->value());
|
||||||
lodManager->setHMDLODDecreaseFPS(ui.hmdMinimumFPSSpin->value());
|
lodManager->setHMDLODDecreaseFPS(ui.hmdMinimumFPSSpin->value());
|
||||||
DependencyManager::get<AvatarManager>()->setRenderDistanceInverseHighLimit(1.0f / ui.smallestReasonableRenderHorizon->value());
|
lodManager->setRenderDistanceInverseHighLimit(1.0f / ui.smallestReasonableRenderHorizon->value());
|
||||||
}
|
}
|
||||||
|
|
|
@ -283,9 +283,9 @@ void Stats::updateStats(bool force) {
|
||||||
STAT_UPDATE(localLeaves, (int)OctreeElement::getLeafNodeCount());
|
STAT_UPDATE(localLeaves, (int)OctreeElement::getLeafNodeCount());
|
||||||
// LOD Details
|
// LOD Details
|
||||||
STAT_UPDATE(lodStatus, "You can see " + DependencyManager::get<LODManager>()->getLODFeedbackText());
|
STAT_UPDATE(lodStatus, "You can see " + DependencyManager::get<LODManager>()->getLODFeedbackText());
|
||||||
STAT_UPDATE(avatarRenderableCount, DependencyManager::get<LODManager>()->getRenderedCount()); //FIXME avatarManager->getNumberInRenderRange());
|
STAT_UPDATE(lodStatsRenderText, DependencyManager::get<LODManager>()->getLODStatsRenderText());
|
||||||
STAT_UPDATE(avatarRenderDistance, (int)round(DependencyManager::get<LODManager>()->getRenderDistance())); // FIXME avatarManager->getRenderDistance())); // deliberately truncating
|
|
||||||
}
|
}
|
||||||
|
STAT_UPDATE(showAcuity, (_expanded || force) && DependencyManager::get<LODManager>()->getUseAcuity());
|
||||||
|
|
||||||
bool performanceTimerIsActive = PerformanceTimer::isActive();
|
bool performanceTimerIsActive = PerformanceTimer::isActive();
|
||||||
bool displayPerf = _expanded && Menu::getInstance()->isOptionChecked(MenuOption::DisplayDebugTimingDetails);
|
bool displayPerf = _expanded && Menu::getInstance()->isOptionChecked(MenuOption::DisplayDebugTimingDetails);
|
||||||
|
|
|
@ -30,6 +30,7 @@ class Stats : public QQuickItem {
|
||||||
Q_PROPERTY(QString monospaceFont READ monospaceFont CONSTANT)
|
Q_PROPERTY(QString monospaceFont READ monospaceFont CONSTANT)
|
||||||
Q_PROPERTY(float audioPacketlossUpstream READ getAudioPacketLossUpstream)
|
Q_PROPERTY(float audioPacketlossUpstream READ getAudioPacketLossUpstream)
|
||||||
Q_PROPERTY(float audioPacketlossDownstream READ getAudioPacketLossDownstream)
|
Q_PROPERTY(float audioPacketlossDownstream READ getAudioPacketLossDownstream)
|
||||||
|
Q_PROPERTY(bool showAcuity READ getShowAcuity WRITE setShowAcuity NOTIFY showAcuityChanged)
|
||||||
|
|
||||||
STATS_PROPERTY(int, serverCount, 0)
|
STATS_PROPERTY(int, serverCount, 0)
|
||||||
STATS_PROPERTY(int, renderrate, 0)
|
STATS_PROPERTY(int, renderrate, 0)
|
||||||
|
@ -37,8 +38,6 @@ class Stats : public QQuickItem {
|
||||||
STATS_PROPERTY(int, simrate, 0)
|
STATS_PROPERTY(int, simrate, 0)
|
||||||
STATS_PROPERTY(int, avatarSimrate, 0)
|
STATS_PROPERTY(int, avatarSimrate, 0)
|
||||||
STATS_PROPERTY(int, avatarCount, 0)
|
STATS_PROPERTY(int, avatarCount, 0)
|
||||||
STATS_PROPERTY(int, avatarRenderableCount, 0)
|
|
||||||
STATS_PROPERTY(int, avatarRenderDistance, 0)
|
|
||||||
STATS_PROPERTY(int, packetInCount, 0)
|
STATS_PROPERTY(int, packetInCount, 0)
|
||||||
STATS_PROPERTY(int, packetOutCount, 0)
|
STATS_PROPERTY(int, packetOutCount, 0)
|
||||||
STATS_PROPERTY(float, mbpsIn, 0)
|
STATS_PROPERTY(float, mbpsIn, 0)
|
||||||
|
@ -77,6 +76,7 @@ class Stats : public QQuickItem {
|
||||||
STATS_PROPERTY(QString, packetStats, QString())
|
STATS_PROPERTY(QString, packetStats, QString())
|
||||||
STATS_PROPERTY(QString, lodStatus, QString())
|
STATS_PROPERTY(QString, lodStatus, QString())
|
||||||
STATS_PROPERTY(QString, timingStats, QString())
|
STATS_PROPERTY(QString, timingStats, QString())
|
||||||
|
STATS_PROPERTY(QString, lodStatsRenderText, QString())
|
||||||
STATS_PROPERTY(int, serverElements, 0)
|
STATS_PROPERTY(int, serverElements, 0)
|
||||||
STATS_PROPERTY(int, serverInternal, 0)
|
STATS_PROPERTY(int, serverInternal, 0)
|
||||||
STATS_PROPERTY(int, serverLeaves, 0)
|
STATS_PROPERTY(int, serverLeaves, 0)
|
||||||
|
@ -108,12 +108,15 @@ public:
|
||||||
emit expandedChanged();
|
emit expandedChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bool getShowAcuity() { return _showAcuity; }
|
||||||
|
void setShowAcuity(bool newValue) { _showAcuity = newValue; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void forceUpdateStats() { updateStats(true); }
|
void forceUpdateStats() { updateStats(true); }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void expandedChanged();
|
void expandedChanged();
|
||||||
|
void showAcuityChanged();
|
||||||
void timingExpandedChanged();
|
void timingExpandedChanged();
|
||||||
void serverCountChanged();
|
void serverCountChanged();
|
||||||
void renderrateChanged();
|
void renderrateChanged();
|
||||||
|
@ -121,8 +124,7 @@ signals:
|
||||||
void simrateChanged();
|
void simrateChanged();
|
||||||
void avatarSimrateChanged();
|
void avatarSimrateChanged();
|
||||||
void avatarCountChanged();
|
void avatarCountChanged();
|
||||||
void avatarRenderableCountChanged();
|
void lodStatsRenderTextChanged();
|
||||||
void avatarRenderDistanceChanged();
|
|
||||||
void packetInCountChanged();
|
void packetInCountChanged();
|
||||||
void packetOutCountChanged();
|
void packetOutCountChanged();
|
||||||
void mbpsInChanged();
|
void mbpsInChanged();
|
||||||
|
@ -172,6 +174,7 @@ private:
|
||||||
int _recentMaxPackets{ 0 } ; // recent max incoming voxel packets to process
|
int _recentMaxPackets{ 0 } ; // recent max incoming voxel packets to process
|
||||||
bool _resetRecentMaxPacketsSoon{ true };
|
bool _resetRecentMaxPacketsSoon{ true };
|
||||||
bool _expanded{ false };
|
bool _expanded{ false };
|
||||||
|
bool _showAcuity{ false };
|
||||||
bool _timingExpanded{ false };
|
bool _timingExpanded{ false };
|
||||||
QString _monospaceFont;
|
QString _monospaceFont;
|
||||||
const AudioIOStats* _audioStats;
|
const AudioIOStats* _audioStats;
|
||||||
|
|
Loading…
Reference in a new issue