
cocos2dx調度器的類圖路上所示,調度器繼承自Ref類,該類實現了內存的自動管理機制。
我們先看一下官方文檔的介紹,一下是引用官方文檔,到-----線為止。
原理介紹
Cocos2d-x調度器為游戲提供定時事件和定時調用服務。所有Node對象都知道如何調度和取消調度事件,使用調度器有幾個好處:
- 每當Node不再可見或已從場景中移除時,調度器會停止。
- Cocos2d-x暫停時,調度器也會停止。當Cocos2d-x重新開始時,調度器也會自動繼續啟動。
- Cocos2d-x封裝了一個供各種不同平臺使用的調度器,使用此調度器你不用關心和跟蹤你所設定的定時對象的銷毀和停止,以及崩潰的風險。
基礎用法
使用場景:游戲中我們經常會隨時間的變化而做一些邏輯判斷,如碰撞檢測。為了解決以上問題,我們引入了調度器,這使得游戲能夠更好的處理動態事件。Cocos2d-x提供了多種調度機制,在開發中我們通常會用到3種調度器:
- 默認調度器:
schedulerUpdate()
- 自定義調度器:
schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
- 單次調度器:
scheduleOnce(SEL_SCHEDULE selector, float delay)
以下我們來對這3種調度器做簡單的介紹。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
我的理解:
我們知道schedulerUpdate()也就是默認調度器的實現是基于update方法,該方法是虛方法定義在Node類中,在cocos2dx框架中。會在每次繪制一幀之前調用update方法,但是默認情況下,這個方法是不啟用的。
也許你也有這個疑問,為什么update方法可以實現調度。可以實現游戲邏輯的判斷。這就需要對游戲有一個認識,游戲都是由一幀一幀繪制而成,在一定范圍內的不同時刻,對應的會是不同的游戲畫面。回想一下,你學過的微積分
,如果我們把游戲的看成是微積分,那么這每一幀就是微分。所以幀率越高,游戲越逼真,越流程,體驗度越高。我們也可以借助這一思想來理解,為什官方框架中會對update做出下面這句解釋。
該調度器是使用Node的刷新事件update方法,該方法在每幀繪制之前都會被調用一次。由于每幀之間時間間隔較短,所以每幀刷新一次已足夠完成大部分游戲過程中需要的邏輯判斷。綠色這句話是引用自官方,可能你會不理解
為什么說每幀之間間隔較短,所以每一幀刷新以此足夠完成部分游戲邏輯的判斷。
由官方文檔我們知道一下代碼的執行順序,下面用偽代碼表示
{
1:
update();執行update方法
drawOneFrame();繪制一幀
go 1;
}
由上面的偽代碼我們知道其想表達的意思是說,由于幀率比較高,能模擬出更真實的效果。而update方法敲好是在兩幀之間調用,所以update的執行時間一般來說是和幀率相互掛鉤。
也就是說update里面的所有變量其實是無限趨近于drawOneFrame()的。所以我們可以再update中書寫一些游戲邏輯。簡而言之,在update里面可以做的事等效于給每一幀里面各個對象的做邏輯判斷。
接下來分析下自定義調度器,先看官方文檔解說。
自定義調度器(scheduler)
游戲開發中,在某些情況下我們可能不需要頻繁的進行邏輯檢測,這樣可以提高游戲性能。所以Cocos2d-x還提供了自定義調度器,可以實現以一定的時間間隔連續調用某個函數。
由于引擎的調度機制,自定義時間間隔必須大于兩幀的間隔,否則兩幀內的多次調用會被合并成一次調用。所以自定義時間間隔應在0.1秒以上。
同樣,取消該調度器可以用unschedule(SEL_SCHEDULE selector, float delay)。
我的理解:
其實讀完這個解說你應該更清楚了我前面理論的正確性,如果你定義的間隔時間比兩幀短,也就是說,將在同一幀類不斷的重復回調selector指向的方法。但這是不需要的所以官方會說將
兩幀內的多次調用會被合并成一次調用。
自定義時間應該在0.1秒以上,幀率就是10.也就是你定義的定時器的頻率應該小于10,或者說間隔時間應該大于0.1。
當然cocos2dx框架還提供單次調度器具體看官方文檔,這個就很好理解了,不解釋和分析。
2015/4/6上午1:03:59