來源: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以來的時間。