From 47f0af818a9c8def13753707b7b5704e477dde46 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 24 Mar 2014 16:45:44 -0700 Subject: [PATCH] Adjust avatar LOD more aggressively: raise detail slowly when above our target window, lower it in proportion to the ratio between desired and actual rates. --- interface/interface_en.ts | 8 ++++---- interface/src/Menu.cpp | 24 +++++++++++++++++++++++- interface/src/Menu.h | 4 +++- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/interface/interface_en.ts b/interface/interface_en.ts index beada5df43..689b45afcf 100644 --- a/interface/interface_en.ts +++ b/interface/interface_en.ts @@ -113,18 +113,18 @@ Menu - + Open .ini config file - - + + Text files (*.ini) - + Save .ini config file diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 6eb03021b3..9b365afa8d 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -61,6 +61,7 @@ Menu* Menu::getInstance() { const ViewFrustumOffset DEFAULT_FRUSTUM_OFFSET = {-135.0f, 0.0f, 0.0f, 25.0f, 0.0f}; const float DEFAULT_FACESHIFT_EYE_DEFLECTION = 0.25f; +const float DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER = 1.0f; const int FIVE_SECONDS_OF_FRAMES = 5 * 60; Menu::Menu() : @@ -75,9 +76,11 @@ Menu::Menu() : _lodToolsDialog(NULL), _maxVoxels(DEFAULT_MAX_VOXELS_PER_SYSTEM), _voxelSizeScale(DEFAULT_OCTREE_SIZE_SCALE), + _avatarLODDistanceMultiplier(DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER), _boundaryLevelAdjust(0), _maxVoxelPacketsPerSecond(DEFAULT_MAX_VOXEL_PPS), _lastAdjust(usecTimestampNow()), + _lastAvatarDetailDrop(usecTimestampNow()), _fpsAverage(FIVE_SECONDS_OF_FRAMES), _loginAction(NULL) { @@ -386,6 +389,8 @@ void Menu::loadSettings(QSettings* settings) { _maxVoxels = loadSetting(settings, "maxVoxels", DEFAULT_MAX_VOXELS_PER_SYSTEM); _maxVoxelPacketsPerSecond = loadSetting(settings, "maxVoxelsPPS", DEFAULT_MAX_VOXEL_PPS); _voxelSizeScale = loadSetting(settings, "voxelSizeScale", DEFAULT_OCTREE_SIZE_SCALE); + _avatarLODDistanceMultiplier = loadSetting(settings, "avatarLODDistanceMultiplier", + DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER); _boundaryLevelAdjust = loadSetting(settings, "boundaryLevelAdjust", 0); settings->beginGroup("View Frustum Offset Camera"); @@ -425,6 +430,7 @@ void Menu::saveSettings(QSettings* settings) { settings->setValue("maxVoxels", _maxVoxels); settings->setValue("maxVoxelsPPS", _maxVoxelPacketsPerSecond); settings->setValue("voxelSizeScale", _voxelSizeScale); + settings->setValue("avatarLODDistanceMultiplier", _avatarLODDistanceMultiplier); settings->setValue("boundaryLevelAdjust", _boundaryLevelAdjust); settings->beginGroup("View Frustum Offset Camera"); settings->setValue("viewFrustumOffsetYaw", _viewFrustumOffset.yaw); @@ -1185,8 +1191,24 @@ void Menu::autoAdjustLOD(float currentFPS) { } _fpsAverage.updateAverage(currentFPS); - bool changed = false; quint64 now = usecTimestampNow(); + + if (_fpsAverage.getAverage() < ADJUST_LOD_DOWN_FPS) { + if (now - _lastAvatarDetailDrop > ADJUST_LOD_DOWN_DELAY) { + // attempt to lower the detail in proportion to the fps difference + float targetFps = (ADJUST_LOD_DOWN_FPS + ADJUST_LOD_UP_FPS) * 0.5f; + _avatarLODDistanceMultiplier *= (targetFps / _fpsAverage.getAverage()); + _lastAvatarDetailDrop = now; + } + } else if (_fpsAverage.getAverage() > ADJUST_LOD_UP_FPS) { + // let the detail level creep slowly upwards + const float DISTANCE_DECREASE_RATE = 0.01f; + const float MINIMUM_DISTANCE_MULTIPLIER = 0.1f; + _avatarLODDistanceMultiplier = qMax(MINIMUM_DISTANCE_MULTIPLIER, + _avatarLODDistanceMultiplier - DISTANCE_DECREASE_RATE); + } + + bool changed = false; quint64 elapsed = now - _lastAdjust; if (elapsed > ADJUST_LOD_DOWN_DELAY && _fpsAverage.getAverage() < ADJUST_LOD_DOWN_FPS diff --git a/interface/src/Menu.h b/interface/src/Menu.h index cb0ca4c5c4..9cd00db8e9 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -89,7 +89,7 @@ public: void autoAdjustLOD(float currentFPS); void setVoxelSizeScale(float sizeScale); float getVoxelSizeScale() const { return _voxelSizeScale; } - float getAvatarLODDistanceMultiplier() const { return DEFAULT_OCTREE_SIZE_SCALE / _voxelSizeScale; } + float getAvatarLODDistanceMultiplier() const { return _avatarLODDistanceMultiplier; } void setBoundaryLevelAdjust(int boundaryLevelAdjust); int getBoundaryLevelAdjust() const { return _boundaryLevelAdjust; } @@ -202,12 +202,14 @@ private: LodToolsDialog* _lodToolsDialog; int _maxVoxels; float _voxelSizeScale; + float _avatarLODDistanceMultiplier; int _boundaryLevelAdjust; QAction* _useVoxelShader; int _maxVoxelPacketsPerSecond; QMenu* _activeScriptsMenu; QString replaceLastOccurrence(QChar search, QChar replace, QString string); quint64 _lastAdjust; + quint64 _lastAvatarDetailDrop; SimpleMovingAverage _fpsAverage; QAction* _loginAction; QAction* _chatAction;