mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-04-08 07:02:25 +02:00
Picking pid values
This commit is contained in:
parent
7dfdc79644
commit
0da22db837
5 changed files with 112 additions and 54 deletions
|
@ -5987,7 +5987,7 @@ void Application::updateRenderArgs(float deltaTime) {
|
|||
_viewFrustum.calculate();
|
||||
}
|
||||
appRenderArgs._renderArgs = RenderArgs(_gpuContext, lodManager->getOctreeSizeScale(),
|
||||
lodManager->getBoundaryLevelAdjust(), lodManager->getSolidAngleHalfTan(), RenderArgs::DEFAULT_RENDER_MODE,
|
||||
lodManager->getBoundaryLevelAdjust(), lodManager->getLODAngleHalfTan(), RenderArgs::DEFAULT_RENDER_MODE,
|
||||
RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE);
|
||||
appRenderArgs._renderArgs._scene = getMain3DScene();
|
||||
|
||||
|
|
|
@ -75,12 +75,8 @@ void LODManager::autoAdjustLOD(float realTimeDelta) {
|
|||
return;
|
||||
}
|
||||
|
||||
auto Kp = _pid.x;
|
||||
auto Ki = _pid.y;
|
||||
auto Kd = _pid.z;
|
||||
|
||||
float oldOctreeSizeScale = _octreeSizeScale;
|
||||
float oldSolidAngle = getSolidAngle();
|
||||
float oldSolidAngle = getLODAngleDeg();
|
||||
|
||||
float targetFPS = getLODDecreaseFPS();
|
||||
float targetPeriod = 1.0f / targetFPS;
|
||||
|
@ -89,29 +85,44 @@ void LODManager::autoAdjustLOD(float realTimeDelta) {
|
|||
static uint64_t lastTime = usecTimestampNow();
|
||||
uint64_t now = usecTimestampNow();
|
||||
auto dt = (float) ((now - lastTime) / double(USECS_PER_MSEC));
|
||||
if (dt < targetPeriod * _pid.w) return;
|
||||
if (dt < targetPeriod * _pidCoefs.w) return;
|
||||
|
||||
float deltaFPS = currentFPS - getLODDecreaseFPS();
|
||||
|
||||
lastTime = now;
|
||||
auto previous_error = 0.f;
|
||||
auto integral = 0.f;
|
||||
auto previous_error = _pidHistory.x;
|
||||
auto previous_integral = _pidHistory.y;
|
||||
|
||||
auto error = getLODDecreaseFPS() - currentFPS;
|
||||
integral = integral + error * dt;
|
||||
auto integral = previous_integral + error * dt;
|
||||
auto derivative = (error - previous_error) / dt;
|
||||
auto output = Kp * error + Ki * integral + Kd * derivative;
|
||||
previous_error = error;
|
||||
|
||||
_pidHistory.x = error;
|
||||
_pidHistory.y = integral;
|
||||
_pidHistory.z = derivative;
|
||||
|
||||
auto Kp = _pidCoefs.x;
|
||||
auto Ki = _pidCoefs.y;
|
||||
auto Kd = _pidCoefs.z;
|
||||
|
||||
_pidOutputs.x = Kp * error;
|
||||
_pidOutputs.y = Ki * integral;
|
||||
_pidOutputs.z = Kd * derivative;
|
||||
|
||||
auto output = _pidOutputs.x + _pidOutputs.y + _pidOutputs.z;
|
||||
|
||||
_pidOutputs.w = output;
|
||||
|
||||
auto newSolidAngle = oldSolidAngle + output;
|
||||
|
||||
newSolidAngle = std::max( 0.5f, std::min(newSolidAngle, 90.f));
|
||||
setLODAngleDeg(newSolidAngle);
|
||||
|
||||
auto halTan = glm::tan(glm::radians(newSolidAngle * 0.5f));
|
||||
//newSolidAngle = std::max( 0.5f, std::min(newSolidAngle, 90.f));
|
||||
|
||||
auto octreeSizeScale = TREE_SCALE * OCTREE_TO_MESH_RATIO / halTan;
|
||||
_octreeSizeScale = octreeSizeScale;
|
||||
//auto halTan = glm::tan(glm::radians(newSolidAngle * 0.5f));
|
||||
|
||||
//auto octreeSizeScale = TREE_SCALE * OCTREE_TO_MESH_RATIO / halTan;
|
||||
// _octreeSizeScale = octreeSizeScale;
|
||||
/*
|
||||
if (currentFPS < getLODDecreaseFPS()) {
|
||||
if (now > _decreaseFPSExpiry) {
|
||||
|
@ -363,36 +374,57 @@ float LODManager::getWorldDetailQuality() const {
|
|||
}
|
||||
|
||||
|
||||
float LODManager::getSolidAngleHalfTan() const {
|
||||
float LODManager::getLODAngleHalfTan() const {
|
||||
return getPerspectiveAccuracyAngleTan(_octreeSizeScale, _boundaryLevelAdjust);
|
||||
}
|
||||
|
||||
float LODManager::getSolidAngle() const {
|
||||
return glm::degrees(2.0 * atan(getSolidAngleHalfTan()));
|
||||
float LODManager::getLODAngle() const {
|
||||
return 2.0f * atan(getLODAngleHalfTan());
|
||||
}
|
||||
float LODManager::getLODAngleDeg() const {
|
||||
return glm::degrees(getLODAngle());
|
||||
}
|
||||
|
||||
void LODManager::setLODAngleDeg(float lodAngle) {
|
||||
auto newSolidAngle = std::max(0.5f, std::min(lodAngle, 90.f));
|
||||
auto halTan = glm::tan(glm::radians(newSolidAngle * 0.5f));
|
||||
auto octreeSizeScale = TREE_SCALE * OCTREE_TO_MESH_RATIO / halTan;
|
||||
setOctreeSizeScale(octreeSizeScale);
|
||||
}
|
||||
|
||||
float LODManager::getPidKp() const {
|
||||
return _pid.x;
|
||||
return _pidCoefs.x;
|
||||
}
|
||||
float LODManager::getPidKi() const {
|
||||
return _pid.y;
|
||||
return _pidCoefs.y;
|
||||
}
|
||||
float LODManager::getPidKd() const {
|
||||
return _pid.z;
|
||||
return _pidCoefs.z;
|
||||
}
|
||||
float LODManager::getPidT() const {
|
||||
return _pid.w;
|
||||
return _pidCoefs.w;
|
||||
}
|
||||
void LODManager::setPidKp(float k) {
|
||||
_pid.x = k;
|
||||
_pidCoefs.x = k;
|
||||
}
|
||||
void LODManager::setPidKi(float k) {
|
||||
_pid.y = k;
|
||||
_pidCoefs.y = k;
|
||||
}
|
||||
void LODManager::setPidKd(float k) {
|
||||
_pid.z = k;
|
||||
_pidCoefs.z = k;
|
||||
}
|
||||
void LODManager::setPidT(float t) {
|
||||
_pid.w = t;
|
||||
_pidCoefs.w = t;
|
||||
}
|
||||
|
||||
float LODManager::getPidOp() const {
|
||||
return _pidOutputs.x;
|
||||
}
|
||||
float LODManager::getPidOi() const {
|
||||
return _pidOutputs.y;
|
||||
}
|
||||
float LODManager::getPidOd() const {
|
||||
return _pidOutputs.z;
|
||||
}
|
||||
float LODManager::getPidO() const {
|
||||
return _pidOutputs.w;
|
||||
}
|
|
@ -69,14 +69,17 @@ class LODManager : public QObject, public Dependency {
|
|||
|
||||
Q_PROPERTY(float worldDetailQuality READ getWorldDetailQuality WRITE setWorldDetailQuality NOTIFY worldDetailQualityChanged)
|
||||
|
||||
Q_PROPERTY(float solidAngleHalfTan READ getSolidAngleHalfTan)
|
||||
Q_PROPERTY(float solidAngle READ getSolidAngle)
|
||||
Q_PROPERTY(float lodAngleDeg READ getLODAngleDeg WRITE setLODAngleDeg)
|
||||
|
||||
Q_PROPERTY(float pidKp READ getPidKp WRITE setPidKp)
|
||||
Q_PROPERTY(float pidKi READ getPidKi WRITE setPidKi)
|
||||
Q_PROPERTY(float pidKd READ getPidKd WRITE setPidKd)
|
||||
Q_PROPERTY(float pidT READ getPidT WRITE setPidT)
|
||||
|
||||
Q_PROPERTY(float pidOp READ getPidOp)
|
||||
Q_PROPERTY(float pidOi READ getPidOi)
|
||||
Q_PROPERTY(float pidOd READ getPidOd)
|
||||
Q_PROPERTY(float pidO READ getPidO)
|
||||
|
||||
public:
|
||||
|
||||
|
@ -187,14 +190,17 @@ public:
|
|||
|
||||
float getAverageRenderTime() const { return _avgRenderTime; };
|
||||
float getMaxTheoreticalFPS() const { return (float)MSECS_PER_SECOND / _avgRenderTime; };
|
||||
|
||||
float getLODLevel() const;
|
||||
void setLODLevel(float level);
|
||||
|
||||
void setWorldDetailQuality(float quality);
|
||||
float getWorldDetailQuality() const;
|
||||
|
||||
float getSolidAngleHalfTan() const;
|
||||
float getSolidAngle() const;
|
||||
float getLODAngleDeg() const;
|
||||
void setLODAngleDeg(float lodAngle);
|
||||
float getLODAngleHalfTan() const;
|
||||
float getLODAngle() const;
|
||||
|
||||
float getPidKp() const;
|
||||
float getPidKi() const;
|
||||
|
@ -205,6 +211,11 @@ public:
|
|||
void setPidKd(float k);
|
||||
void setPidT(float t);
|
||||
|
||||
float getPidOp() const;
|
||||
float getPidOi() const;
|
||||
float getPidOd() const;
|
||||
float getPidO() const;
|
||||
|
||||
signals:
|
||||
|
||||
/**jsdoc
|
||||
|
@ -237,7 +248,9 @@ private:
|
|||
float _octreeSizeScale = DEFAULT_OCTREE_SIZE_SCALE;
|
||||
int _boundaryLevelAdjust = 0;
|
||||
|
||||
glm::vec4 _pid{ 0.06f, 0.005f, 0.01f, 4.0f };
|
||||
glm::vec4 _pidCoefs{ 0.1526f, 0.00000015f, 15.f, 4.0f };
|
||||
glm::vec4 _pidHistory{ 0.0f };
|
||||
glm::vec4 _pidOutputs{ 0.0f };
|
||||
|
||||
uint64_t _decreaseFPSExpiry { 0 };
|
||||
uint64_t _increaseFPSExpiry { 0 };
|
||||
|
|
|
@ -29,6 +29,7 @@ Item {
|
|||
|
||||
property var labelAreaWidthScale: 0.5
|
||||
property bool integral: false
|
||||
property var numDigits: 2
|
||||
|
||||
property var valueVarSetter: defaultSet
|
||||
property alias valueVar : sliderControl.value
|
||||
|
@ -71,7 +72,7 @@ Item {
|
|||
HifiControls.Label {
|
||||
id: labelValue
|
||||
enabled: root.showValue
|
||||
text: sliderControl.value.toFixed(root.integral ? 0 : 2)
|
||||
text: sliderControl.value.toFixed(root.integral ? 0 : root.numDigits)
|
||||
anchors.right: labelControl.right
|
||||
anchors.rightMargin: 5
|
||||
anchors.verticalCenter: root.verticalCenter
|
||||
|
|
|
@ -68,11 +68,11 @@ Item {
|
|||
RichSlider {
|
||||
visible: !LODManager.automaticLODAdjust
|
||||
showLabel: true
|
||||
label: "LOD Level"
|
||||
valueVar: LODManager["lodLevel"]
|
||||
valueVarSetter: (function (v) { LODManager["lodLevel"] = v })
|
||||
max: 1.0
|
||||
min: 0.0
|
||||
label: "LOD Angle [deg]"
|
||||
valueVar: LODManager["lodAngleDeg"]
|
||||
valueVarSetter: (function (v) { LODManager["lodAngleDeg"] = v })
|
||||
max: 90.0
|
||||
min: 0.5
|
||||
integral: false
|
||||
|
||||
anchors.left: parent.left
|
||||
|
@ -85,9 +85,10 @@ Item {
|
|||
label: "LOD PID Kp"
|
||||
valueVar: LODManager["pidKp"]
|
||||
valueVarSetter: (function (v) { LODManager["pidKp"] = v })
|
||||
max: 1.0
|
||||
max: 0.2
|
||||
min: 0.0
|
||||
integral: false
|
||||
numDigits: 3
|
||||
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
@ -98,9 +99,10 @@ Item {
|
|||
label: "LOD PID Ki"
|
||||
valueVar: LODManager["pidKi"]
|
||||
valueVarSetter: (function (v) { LODManager["pidKi"] = v })
|
||||
max: 0.02
|
||||
max: 0.000005
|
||||
min: 0.0
|
||||
integral: false
|
||||
numDigits: 8
|
||||
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
@ -111,9 +113,10 @@ Item {
|
|||
label: "LOD PID Kd"
|
||||
valueVar: LODManager["pidKd"]
|
||||
valueVarSetter: (function (v) { LODManager["pidKd"] = v })
|
||||
max: 0.1
|
||||
max: 10.0
|
||||
min: 0.0
|
||||
integral: false
|
||||
numDigits: 3
|
||||
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
@ -124,9 +127,9 @@ Item {
|
|||
label: "LOD PID Num T"
|
||||
valueVar: LODManager["pidT"]
|
||||
valueVarSetter: (function (v) { LODManager["pidT"] = v })
|
||||
max: 5.0
|
||||
max: 10.0
|
||||
min: 0.0
|
||||
integral: false
|
||||
integral: true
|
||||
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
@ -199,34 +202,43 @@ Item {
|
|||
]
|
||||
}
|
||||
PlotPerf {
|
||||
title: "LOD"
|
||||
title: "LOD Angle"
|
||||
height: parent.evalEvenHeight()
|
||||
object: LODManager
|
||||
valueScale: 0.1
|
||||
valueUnit: ""
|
||||
valueScale: 1.0
|
||||
valueUnit: "deg"
|
||||
plots: [
|
||||
{
|
||||
prop: "lodLevel",
|
||||
label: "LOD",
|
||||
prop: "lodAngleDeg",
|
||||
label: "LOD Angle",
|
||||
color: "#9999FF"
|
||||
}
|
||||
]
|
||||
}
|
||||
PlotPerf {
|
||||
title: "Solid Angle"
|
||||
title: "PID Output"
|
||||
height: parent.evalEvenHeight()
|
||||
object: LODManager
|
||||
valueScale: 1.0
|
||||
valueUnit: "deg"
|
||||
//valueNumDigits: 0
|
||||
plots: [
|
||||
{
|
||||
prop: "solidAngle",
|
||||
label: "Solid Angle",
|
||||
prop: "pidOp",
|
||||
label: "Op",
|
||||
color: "#9999FF"
|
||||
},
|
||||
{
|
||||
prop: "pidOi",
|
||||
label: "Oi",
|
||||
color: "#FFFFFF"
|
||||
},
|
||||
{
|
||||
prop: "pidOd",
|
||||
label: "Od",
|
||||
color: "#FF6666"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Separator {
|
||||
id: bottomLine
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue