diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index e83df85ff0..2f99ccfdc8 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -75,6 +75,19 @@ namespace render { } } +static uint64_t timeProcessingJoints = 0; +static int32_t numJointsProcessed = 0; + +float Avatar::getNumJointsProcessedPerSecond() { + float rate = 0.0f; + if (timeProcessingJoints > 0) { + rate = (float)(numJointsProcessed * USECS_PER_SECOND) / (float)timeProcessingJoints; + } + timeProcessingJoints = 0; + numJointsProcessed = 0; + return rate; +} + Avatar::Avatar(RigPointer rig) : AvatarData(), _skeletonOffset(0.0f), @@ -319,6 +332,7 @@ void Avatar::simulate(float deltaTime) { } } + uint64_t start = usecTimestampNow(); if (_shouldAnimate && !_shouldSkipRender && (avatarPositionInView || avatarMeshInView)) { { PerformanceTimer perfTimer("skeleton"); @@ -345,6 +359,8 @@ void Avatar::simulate(float deltaTime) { PerformanceTimer perfTimer("skeleton"); _skeletonModel->simulate(deltaTime, false); } + timeProcessingJoints += usecTimestampNow() - start; + numJointsProcessed += _jointData.size(); // update animation for display name fade in/out if ( _displayNameTargetAlpha != _displayNameAlpha) { diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index dd0a9b2ab1..784f380028 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -57,6 +57,8 @@ class Avatar : public AvatarData { Q_PROPERTY(glm::vec3 skeletonOffset READ getSkeletonOffset WRITE setSkeletonOffset) public: + static float getNumJointsProcessedPerSecond(); + explicit Avatar(RigPointer rig = nullptr); ~Avatar(); diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index e2058ae1cf..53f17e9635 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -25,13 +25,13 @@ #endif +#include #include #include #include #include #include #include -#include #include "Application.h" #include "Avatar.h" @@ -124,6 +124,9 @@ void AvatarManager::updateMyAvatar(float deltaTime) { } } + +Q_LOGGING_CATEGORY(trace_simulation_avatar, "trace.simulation.avatar"); + void AvatarManager::updateOtherAvatars(float deltaTime) { // lock the hash for read to check the size QReadLocker lock(&_hashLock); @@ -143,6 +146,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { // simulate avatars auto hashCopy = getHashCopy(); + uint64_t start = usecTimestampNow(); AvatarHash::iterator avatarIterator = hashCopy.begin(); while (avatarIterator != hashCopy.end()) { auto avatar = std::static_pointer_cast(avatarIterator.value()); @@ -165,6 +169,10 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { // simulate avatar fades simulateAvatarFades(deltaTime); + + SAMPLE_PROFILE_COUNTER(0.1f, simulation_avatar, "NumAvatarsPerSec", + { { "NumAvatarsPerSec", (float)(size() * USECS_PER_SECOND) / (float)(usecTimestampNow() - start) } }); + SAMPLE_PROFILE_COUNTER(0.1f, simulation_avatar, "NumJointsPerSec", { { "NumJointsPerSec", Avatar::getNumJointsProcessedPerSecond() } }); } void AvatarManager::postUpdate(float deltaTime) {