c++写的通用计时器工具(二)

2014-11-24 07:41:37 · 作者: · 浏览: 1
// 可以循环,第一次直接调用
if (isLoop) {
m_startTime = 0;
} else {
m_startTime = TimeGet();
}
m_delayTime = ms;
m_function = std::move(func);
}
bool Timer::process()
{
if (TimeGet() < m_startTime + m_delayTime) {
return false;
}
m_function(m_timerId);
if (m_isLoop) {
m_startTime = TimeGet();
return false;
} else {
return true;
}
}
void TimerMgr::processTimer()
{
for (int i = 0; i < (int)m_allTimers.size(); ++i) {
Timer* timer = m_allTimers[i];
if (timer && timer->process()) {
delete timer;
m_allTimers[i] = NULL;
}
}
for (auto itr = m_allTimers.begin(); itr != m_allTimers.end();) {
if (*itr == NULL) {
itr = m_allTimers.erase(itr);
} else {
++itr;
}
}
}
计时器说简单也很简单,就是纪录开始时间,每桢监测,如果到延迟时间了则执行对应的回调函数。 算是游戏中非常基础的工具类。这里借助function和bind实现了更加灵活的回调绑定。 回调函数没有任何限制,也不需要回调者继承任何东西。比如我们有一个战斗管理者,开始战斗的时候播放一个特效,延时1秒开始战斗流程。那么就可以这么写。
[cpp]
class FightMgr
{
public:
void play()
{
// play effect here
delay_call(1000, bind(&FightMgr::startFight, this, param1, param2), false);
}
void startFight(int playerId, int data)
{
}
}
计时器delay_call第二个参数是一个function,通过bind可以绑定任意函数,甚至可以传lambda。
这个计时器并不是多线程异步操作的,需要游戏每桢运行的时候调用TimerMgr::getSingleton().process(); 这样的好处是我们写代码的时候不需要考虑线程同步,虽然我延时执行某些函数,但是都是在主线程完成的调用,也不用担心opengl的content失效等问题。
没有其他需要特意说明的了,最后再次感叹一下function的无穷魅力,还在用函数指针的同学要补充一下新工具了。