void CTimeProfiler::Update() { //FIXME non-locking threadsafe boost::unique_lock<boost::mutex> ulk(m, boost::defer_lock); while (!ulk.try_lock()) {} ++currentPosition; currentPosition &= TimeRecord::frames_size-1; std::map<std::string,TimeRecord>::iterator pi; for (pi = profile.begin(); pi != profile.end(); ++pi) { pi->second.frames[currentPosition] = spring_notime; } const spring_time curTime = spring_gettime(); const float timeDiff = spring_diffmsecs(curTime, lastBigUpdate); if (timeDiff > 500.0f) // twice every second { for (std::map<std::string,TimeRecord>::iterator pi = profile.begin(); pi != profile.end(); ++pi) { pi->second.percent = spring_tomsecs(pi->second.current) / timeDiff; pi->second.current = spring_notime; if(pi->second.percent > pi->second.peak) { pi->second.peak = pi->second.percent; pi->second.newpeak = true; } else pi->second.newpeak = false; } lastBigUpdate = curTime; } }
void CTimeProfiler::Update() { //FIXME non-locking threadsafe boost::unique_lock<boost::mutex> ulk(m, boost::defer_lock); while (!ulk.try_lock()) {} ++currentPosition; currentPosition &= TimeRecord::frames_size-1; for (auto& pi: profile) { pi.second.frames[currentPosition] = spring_notime; } const spring_time curTime = spring_gettime(); const float timeDiff = spring_diffmsecs(curTime, lastBigUpdate); if (timeDiff > 500.0f) // twice every second { for (auto& pi: profile) { auto& p = pi.second; p.percent = spring_tomsecs(p.current) / timeDiff; p.current = spring_notime; p.newLagPeak = false; p.newPeak = false; if(p.percent > p.peak) { p.peak = p.percent; p.newPeak = true; } } lastBigUpdate = curTime; } if (curTime.toSecsi() % 6 == 0) { for (auto& pi: profile) { auto& p = pi.second; p.maxLag *= 0.5f; } } }
ScopedOnceTimer::~ScopedOnceTimer() { LOG("%s: %lli ms", GetName().c_str(), spring_diffmsecs(spring_gettime(), starttime)); }