來源:http://www.torquecn.com/%E5%B1%B1%E4%B8%8A/archive/2007/01/24/14.aspx
ickable
對(duì)象以一個(gè)固定的tick速率來接收更新(消息)。每個(gè)tickable對(duì)象都要確保每隔32毫秒進(jìn)行一次更新(默認(rèn)).但這個(gè)并不意味著每個(gè)32毫秒對(duì)
象一定會(huì)有一個(gè)tick,對(duì)于每幀需要進(jìn)行大量數(shù)據(jù)處理的環(huán)境,將會(huì)導(dǎo)致一種情形,在這種情形下,對(duì)象在某個(gè)時(shí)間T接收到一個(gè)tick,直到T+64才得
到另一個(gè)tick,這樣在T+64的時(shí)刻這個(gè)對(duì)象將會(huì)收到兩個(gè)tick,就超出了每32毫秒刷新一次的約定.
創(chuàng)建 Tickable對(duì)象
為了創(chuàng)建一個(gè)tickable對(duì)象,你需要做的就是從Itickable繼承. ITickable
設(shè)計(jì)就是用在多重繼承的環(huán)境,它是一個(gè)很簡(jiǎn)單的類。還有其它特殊的可以運(yùn)行Itickable的類,比如GuiTickCtrl.作為舉例,下面就展示了
如何創(chuàng)建一個(gè)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:
...
};
上面的方法就是讓一個(gè)對(duì)象執(zhí)行ITickable 接口所需要的,ITickable
是個(gè)純虛類,這就意味這,這些方法必須至少有一個(gè)實(shí)例。同樣,類似于這個(gè)的多重繼承環(huán)境,typedef
不應(yīng)該定義ITickable,但是可以用來定義適當(dāng)?shù)幕悺Tickable 僅僅是一個(gè)接口。繼承來自ITickable 的屬性,
ITickable接口
Itickable接口由三個(gè)方法組成
processTick
processTick這個(gè)方法在每次tick的時(shí)候被調(diào)用,如果這個(gè)對(duì)象的
isProcessingTicks返回為真。默認(rèn)下, ITickable::isProcessingTicks
的返回值是ITickable::mTickable (通過公共方法ITickable::setProcessTick
來設(shè)定)。當(dāng)以一個(gè)固定速率處理時(shí),所有的代碼都應(yīng)該在這個(gè)方法中完成.
interpolateTick
如果isProcessingTicks
的返回值為真,則這個(gè)方法每幀都會(huì)被調(diào)用。她允許Tickable對(duì)象在ticks之間進(jìn)行插值.它包含有一個(gè)32位的浮點(diǎn)值,這個(gè)浮點(diǎn)值代表當(dāng)前到下個(gè)
tick之間的時(shí)間,以一個(gè)百分比來表達(dá)。這個(gè)delta時(shí)間可以用下面的方式進(jìn)行描述:
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時(shí)間越接近零,那么相當(dāng)于越接近于下個(gè)tick。
advanceTime
Every frame an ITickable object will recieve
advanceTime methods regardless of the return value of
isProcessingTicks. 每幀,不管isProcessingTicks返回值是多少,ITickable
對(duì)象將會(huì)接收advanceTime方法。這個(gè)方法有一個(gè)32位的表示時(shí)間量的浮點(diǎn)值,單位秒,從上次調(diào)用advanceTime以來的時(shí)間。