Merge pull request #8 from AndrewMeadows/avatarBandwidthBudgetImprovements

count avatar joint updates and non-updates
This commit is contained in:
Brad Hefta-Gaub 2017-02-22 17:53:15 -08:00 committed by GitHub
commit 10f465f8ea
6 changed files with 47 additions and 21 deletions

View file

@ -107,11 +107,11 @@ Item {
} }
StatText { StatText {
visible: root.expanded visible: root.expanded
text: "Fully Simulated Avatars: " + root.fullySimulatedAvatarCount text: "Avatars Updated: " + root.updatedAvatarCount
} }
StatText { StatText {
visible: root.expanded visible: root.expanded
text: "Partially Simulated Avatars: " + root.partiallySimulatedAvatarCount text: "Avatars NOT Updated: " + root.notUpdatedAvatarCount
} }
} }
} }

View file

@ -183,6 +183,8 @@ public:
Q_INVOKABLE float getSimulationRate(const QString& rateName = QString("")) const; Q_INVOKABLE float getSimulationRate(const QString& rateName = QString("")) const;
bool hasNewJointData() const { return _hasNewJointData; }
public slots: public slots:
// FIXME - these should be migrated to use Pose data instead // FIXME - these should be migrated to use Pose data instead

View file

@ -195,8 +195,8 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
uint64_t renderExpiry = startTime + RENDER_UPDATE_BUDGET; uint64_t renderExpiry = startTime + RENDER_UPDATE_BUDGET;
uint64_t maxExpiry = startTime + MAX_UPDATE_BUDGET; uint64_t maxExpiry = startTime + MAX_UPDATE_BUDGET;
int fullySimulatedAvatars = 0; int numAvatarsUpdated = 0;
int partiallySimulatedAvatars = 0; int numAVatarsNotUpdated = 0;
while (!sortedAvatars.empty()) { while (!sortedAvatars.empty()) {
const AvatarPriority& sortData = sortedAvatars.top(); const AvatarPriority& sortData = sortedAvatars.top();
const auto& avatar = std::static_pointer_cast<Avatar>(sortData.avatar); const auto& avatar = std::static_pointer_cast<Avatar>(sortData.avatar);
@ -217,33 +217,57 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
} }
avatar->animateScaleChanges(deltaTime); avatar->animateScaleChanges(deltaTime);
const float OUT_OF_VIEW_THRESHOLD = 0.5f * AvatarData::OUT_OF_VIEW_PENALTY;
uint64_t now = usecTimestampNow(); uint64_t now = usecTimestampNow();
if (now < renderExpiry) { if (now < renderExpiry) {
// we're within budget // we're within budget
const float OUT_OF_VIEW_THRESHOLD = 0.5f * AvatarData::OUT_OF_VIEW_PENALTY;
bool inView = sortData.priority > OUT_OF_VIEW_THRESHOLD; bool inView = sortData.priority > OUT_OF_VIEW_THRESHOLD;
if (inView && avatar->hasNewJointData()) {
numAvatarsUpdated++;
}
avatar->simulate(deltaTime, inView); avatar->simulate(deltaTime, inView);
avatar->updateRenderItem(pendingChanges); avatar->updateRenderItem(pendingChanges);
avatar->setLastRenderUpdateTime(startTime); avatar->setLastRenderUpdateTime(startTime);
fullySimulatedAvatars++;
} else if (now < maxExpiry) { } else if (now < maxExpiry) {
// we've spent most of our time budget, but we still simulate() the avatar as it if were out of view // we've spent most of our time budget, but we still simulate() the avatar as it if were out of view
// --> some avatars may freeze until their priority trickles up // --> some avatars may freeze until their priority trickles up
const bool inView = false; bool inView = sortData.priority > OUT_OF_VIEW_THRESHOLD;
avatar->simulate(deltaTime, inView); if (inView && avatar->hasNewJointData()) {
partiallySimulatedAvatars++; numAVatarsNotUpdated++;
}
avatar->simulate(deltaTime, false);
} else { } else {
// we've spent ALL of our time budget --> bail on the rest of the avatar updates // we've spent ALL of our time budget --> bail on the rest of the avatar updates
// --> more avatars may freeze until their priority trickles up
// --> some scale or fade animations may glitch // --> some scale or fade animations may glitch
// --> some avatar velocity measurements may be a little off // --> some avatar velocity measurements may be a little off
// HACK: no time simulate, but we will take the time to count how many were tragically missed
bool inView = sortData.priority > OUT_OF_VIEW_THRESHOLD;
if (!inView) {
break;
}
if (inView && avatar->hasNewJointData()) {
numAVatarsNotUpdated++;
}
sortedAvatars.pop();
while (inView && !sortedAvatars.empty()) {
const AvatarPriority& newSortData = sortedAvatars.top();
const auto& newAvatar = std::static_pointer_cast<Avatar>(newSortData.avatar);
inView = newSortData.priority > OUT_OF_VIEW_THRESHOLD;
if (inView && newAvatar->hasNewJointData()) {
numAVatarsNotUpdated++;
}
sortedAvatars.pop();
}
break; break;
} }
sortedAvatars.pop(); sortedAvatars.pop();
} }
_avatarSimulationTime = (float)(usecTimestampNow() - startTime) / (float)USECS_PER_MSEC; _avatarSimulationTime = (float)(usecTimestampNow() - startTime) / (float)USECS_PER_MSEC;
_fullySimulatedAvatars = fullySimulatedAvatars; _numAvatarsUpdated = numAvatarsUpdated;
_partiallySimulatedAvatars = partiallySimulatedAvatars; _numAvatarsNotUpdated = numAVatarsNotUpdated;
qApp->getMain3DScene()->enqueuePendingChanges(pendingChanges); qApp->getMain3DScene()->enqueuePendingChanges(pendingChanges);
simulateAvatarFades(deltaTime); simulateAvatarFades(deltaTime);

View file

@ -43,8 +43,8 @@ public:
std::shared_ptr<MyAvatar> getMyAvatar() { return _myAvatar; } std::shared_ptr<MyAvatar> getMyAvatar() { return _myAvatar; }
AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const override; AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const override;
int getFullySimulatedAvatars() const { return _fullySimulatedAvatars; } int getNumAvatarsUpdated() const { return _numAvatarsUpdated; }
int getPartiallySimulatedAvatars() const { return _partiallySimulatedAvatars; } int getNumAvatarsNotUpdated() const { return _numAvatarsNotUpdated; }
float getAvatarSimulationTime() const { return _avatarSimulationTime; } float getAvatarSimulationTime() const { return _avatarSimulationTime; }
void updateMyAvatar(float deltaTime); void updateMyAvatar(float deltaTime);
@ -120,8 +120,8 @@ private:
VectorOfMotionStates _motionStatesToRemoveFromPhysics; VectorOfMotionStates _motionStatesToRemoveFromPhysics;
RateCounter<> _myAvatarSendRate; RateCounter<> _myAvatarSendRate;
int _fullySimulatedAvatars { 0 }; int _numAvatarsUpdated { 0 };
int _partiallySimulatedAvatars { 0 }; int _numAvatarsNotUpdated { 0 };
float _avatarSimulationTime { 0.0f }; float _avatarSimulationTime { 0.0f };
}; };

View file

@ -121,8 +121,8 @@ void Stats::updateStats(bool force) {
auto avatarManager = DependencyManager::get<AvatarManager>(); auto avatarManager = DependencyManager::get<AvatarManager>();
// we need to take one avatar out so we don't include ourselves // we need to take one avatar out so we don't include ourselves
STAT_UPDATE(avatarCount, avatarManager->size() - 1); STAT_UPDATE(avatarCount, avatarManager->size() - 1);
STAT_UPDATE(fullySimulatedAvatarCount, avatarManager->getFullySimulatedAvatars()); STAT_UPDATE(updatedAvatarCount, avatarManager->getNumAvatarsUpdated());
STAT_UPDATE(partiallySimulatedAvatarCount, avatarManager->getPartiallySimulatedAvatars()); STAT_UPDATE(notUpdatedAvatarCount, avatarManager->getNumAvatarsNotUpdated());
STAT_UPDATE(serverCount, (int)nodeList->size()); STAT_UPDATE(serverCount, (int)nodeList->size());
STAT_UPDATE(framerate, qApp->getFps()); STAT_UPDATE(framerate, qApp->getFps());
if (qApp->getActiveDisplayPlugin()) { if (qApp->getActiveDisplayPlugin()) {

View file

@ -49,8 +49,8 @@ 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, fullySimulatedAvatarCount, 0) STATS_PROPERTY(int, updatedAvatarCount, 0)
STATS_PROPERTY(int, partiallySimulatedAvatarCount, 0) STATS_PROPERTY(int, notUpdatedAvatarCount, 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)
@ -159,8 +159,8 @@ signals:
void simrateChanged(); void simrateChanged();
void avatarSimrateChanged(); void avatarSimrateChanged();
void avatarCountChanged(); void avatarCountChanged();
void fullySimulatedAvatarCountChanged(); void updatedAvatarCountChanged();
void partiallySimulatedAvatarCountChanged(); void notUpdatedAvatarCountChanged();
void packetInCountChanged(); void packetInCountChanged();
void packetOutCountChanged(); void packetOutCountChanged();
void mbpsInChanged(); void mbpsInChanged();