2012-08-08 55 views
1

我這行,我的一個場景:的Cocos2D 2.0增加時間表精度

[self schedule:@selector(storeValue:) interval:1.0/30.0]; 

storeValue是非常基本的和快速的。它只是將一個圖層的位置存儲在NSMutableArray上。我需要這個storeValue儘可能多精確地定時被調用,但做一些測量之後,這些都是每個storeValue通話之間測得的時間間隔:

interval 0 = 0 
interval 1 = 0.049962 
interval 2 = 0.033345 
interval 3 = 0.033332 
interval 4 = 0.049994 
interval 5 = 0.050050 
interval 6 = 0.049968 
interval 7 = 0.033998 
interval 8 = 0.049331 
interval 9 = 0.050015 
interval 10 = 0.049979 
interval 11 = 0.049999 
interval 12 = 0.033357 
interval 13 = 0.033307 
interval 14 = 0.049997 
interval 15 = 0.033322 
interval 16 = 0.050317 
interval 17 = 0.049743 
interval 18 = 0.049973 
interval 19 = 0.033322 
interval 20 = 0.050024 
interval 21 = 0.049975 
interval 22 = 0.049987 
interval 23 = 0.033316 
interval 24 = 0.050038 
interval 25 = 0.050149 
interval 26 = 0.049852 
interval 27 = 0.049989 
interval 28 = 0.050011 

所以,你看到的,方法是帶一個而不是總是0.03333(1/30)。

我試圖從storeValue中刪除所有代碼來查看storeValue被調用的頻率並獲得相同的不規則時間。

最大的問題是:我該怎麼做才能提高進度精度?我應該使用NSTimer嗎? GCD執行計劃任務的其他方法?有什麼建議麼?

感謝。

注:我現在發現,如果我把interval = 0,storeValue將被調用每一幀,這意味着1/60秒和精度是真棒。好的,我可以在邏輯上調用storeValue的一半時間,但是很高興知道爲什麼日程安排如此不準確以及是否有改進它的方法。

+0

Blah,我會建議安排更新方法,它會調用每一幀,並添加一些邏輯......但是,我只有一個建議:如果您在實際設備上測試,NSLog不是微不足道的。它需要I/O並需要數百個cpu週期。 – Mazyod 2012-08-08 18:10:50

+0

好的,但更新發生時精度高於98%,而正常時間表的精度低於60%。 – SpaceDog 2012-08-08 19:06:03

回答

1

當您安排某些事情時,選擇器和計時器頻率將傳遞給Cocos2d sharedScheduler。然後sharedDirector在每個幀上調用[[Scheduler sharedScheduler] tick: dt];。如果您的計時器超過了閾值,計劃程序將調用您的選擇器。

所以頻率不能比主循環頻率更精確(最大1/60分鐘 - 取決於實際的場景複雜度)。可能1/30的閾值並不是在每個第二幀上,這就是爲什麼你沒有精確的日誌值。

我可以建議通過NSTimer在其他線程上調用您的選擇器,而不使用Cocos2d調度程序。

+0

測試了很多解決方案後,NSTimer是99.5%精度的最佳解決方案! – SpaceDog 2012-08-09 11:56:41

0

iOS不是Real-time operating system,因此您永遠無法保證您的預定回叫/ NSTimer /等。將會在恰好1/30秒的時間內發生。這個精確度會隨着操作系統的處理而不同。

但是,您可以執行的操作是使用每個回調之間傳遞的實際時間來說明缺少一致性。

+0

好的,但問題是用NSTimer解決方法給我99.5%的精度,而Cocos2D時間表的精度低於60%。 – SpaceDog 2012-08-09 11:57:40

+0

@RubberDuck的精確度會因許多因素而降低,包括運行哪個硬件,您的應用正在做什麼以及手機在後臺做什麼(電子郵件,同步等)。基本上,不要寫假設'NSTimer'的代碼將保證你達到99%的精度,因爲它不能。 – MechEthan 2012-08-09 15:23:07