void CTimeProfiler::AddTime(const std::string& name, const spring_time time, const bool showGraph) { auto pi = profile.find(name); if (pi != profile.end()) { // profile already exists //FIXME use atomic ints auto& p = pi->second; p.total += time; p.current += time; p.frames[currentPosition] += time; if (p.maxLag < time.toMilliSecsf()) { p.maxLag = time.toMilliSecsf(); p.newLagPeak = true; } } else { boost::unique_lock<boost::mutex> ulk(m, boost::defer_lock); while (!ulk.try_lock()) {} // create a new profile auto& p = profile[name]; p.total = time; p.current = time; p.maxLag = time.toMilliSecsf(); p.percent = 0; memset(p.frames, 0, TimeRecord::frames_size * sizeof(unsigned)); static UnsyncedRNG rand; rand.Seed(spring_tomsecs(spring_gettime())); p.color.x = rand.RandFloat(); p.color.y = rand.RandFloat(); p.color.z = rand.RandFloat(); p.showGraph = showGraph; } }
void spring_time::sleep() { // for very short time intervals use a yielding loop (yield is ~5x more accurate than sleep(), check the UnitTest) if (toMilliSecsf() < (avgThreadSleepTimeMilliSecs + avgThreadYieldTimeMilliSecs * 5.0f)) { const spring_time s = gettime(); while ((gettime() - s) < *this) thread_yield(); return; } // expected wakeup time const spring_time t0 = gettime() + *this; #if defined(SPRINGTIME_USING_STD_SLEEP) this_thread::sleep_for(chrono::nanoseconds(toNanoSecsi())); #else boost::this_thread::sleep(boost::posix_time::microseconds(std::ceil(toNanoSecsf() * 1e-3))); #endif const spring_time t1 = gettime(); const spring_time dt = t1 - t0; if (t1 >= t0) { boost::mutex::scoped_lock lock(sleepTimeMutex); avgThreadSleepTimeMilliSecs = mix(avgThreadSleepTimeMilliSecs, dt.toMilliSecsf(), 0.1f); } }
static void thread_yield() { const spring_time t0 = spring_time::gettime(); this_thread::yield(); const spring_time t1 = spring_time::gettime(); const spring_time dt = t1 - t0; if (t1 >= t0) { boost::mutex::scoped_lock lock(yieldTimeMutex); avgThreadYieldTimeMilliSecs = mix(avgThreadYieldTimeMilliSecs, dt.toMilliSecsf(), 0.1f); } }
void SmoothController::ScreenEdgeMove(float3 move) { if (flipped) { move.x = -move.x; move.y = -move.y; } move *= math::sqrt(move.z) * 200.0f; const float3 thisMove(move.x * pixelSize * 2.0f * scrollSpeed, 0.0f, -move.y * pixelSize * 2.0f * scrollSpeed); static spring_time lastScreenMove = spring_gettime(); const spring_time timeDiff = spring_gettime() - lastScreenMove; lastScreenMove = spring_gettime(); if (thisMove.x != 0 || thisMove.z != 0) { // user want to move with mouse on screen edge lastSource = ScreenEdge; Move(thisMove, timeDiff.toMilliSecsf()); } else if (lastSource == ScreenEdge) { // last move order was given by screen edge, so call Move() to break Move(thisMove, timeDiff.toMilliSecsf()); } }