来源:http://www.torquecn.com/%E5%B1%B1%E4%B8%8A/archive/2007/01/24/14.aspx
ickable
对象以一个固定的tick速率来接收更新(消息)。每个tickable对象都要确保每隔32毫秒进行一次更新(默认).但这个并不意味着每个32毫秒对
象一定会有一个tick,对于每帧需要进行大量数据处理的环境,将会导致一种情形,在这种情形下,对象在某个时间T接收到一个tick,直到T+64才得
到另一个tick,这样在T+64的时刻这个对象将会收到两个tick,就超出了每32毫秒刷新一次的约定.
创建 Tickable对象
为了创建一个tickable对象,你需要做的就是从Itickable继承. ITickable
设计就是用在多重继承的环境,它是一个很简单的类。还有其它特殊的可以运行Itickable的类,比如GuiTickCtrl.作为举例,下面就展示了
如何创建一个tickable SimObject:
class FooClass : public SimObject, public virtual ITickable
{
// You still mark SimObject as Parent
typedef SimObject Parent;
private:
...
protected:
// These three methods are the interface for ITickable
virtual void interpolateTick( F32 delta );
virtual void processTick();
virtual void advanceTime( F32 timeDelta );
public:
...
};
上面的方法就是让一个对象执行ITickable 接口所需要的,ITickable
是个纯虚类,这就意味这,这些方法必须至少有一个实例。同样,类似于这个的多重继承环境,typedef
不应该定义ITickable,但是可以用来定义适当的基类。ITickable 仅仅是一个接口。继承来自ITickable 的属性,
ITickable接口
Itickable接口由三个方法组成
processTick
processTick这个方法在每次tick的时候被调用,如果这个对象的
isProcessingTicks返回为真。默认下, ITickable::isProcessingTicks
的返回值是ITickable::mTickable (通过公共方法ITickable::setProcessTick
来设定)。当以一个固定速率处理时,所有的代码都应该在这个方法中完成.
interpolateTick
如果isProcessingTicks
的返回值为真,则这个方法每帧都会被调用。她允许Tickable对象在ticks之间进行插值.它包含有一个32位的浮点值,这个浮点值代表当前到下个
tick之间的时间,以一个百分比来表达。这个delta时间可以用下面的方式进行描述:
delta time = time until next tick / total time per tick
therefore the delta time approaches zero as the simulation moves closer to the next tick. 也就是说delta时间越接近零,那么相当于越接近于下个tick。
advanceTime
Every frame an ITickable object will recieve
advanceTime methods regardless of the return value of
isProcessingTicks. 每帧,不管isProcessingTicks返回值是多少,ITickable
对象将会接收advanceTime方法。这个方法有一个32位的表示时间量的浮点值,单位秒,从上次调用advanceTime以来的时间。