1

シーンの 1 つに次の行があります。

[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 秒を意味し、精度が素晴らしいことを意味します。OK、半分の時間で storeValue を呼び出すロジックを作成できますが、スケジュールがそれほど不正確である理由と、それを改善する方法があれば教えていただければ幸いです。

4

2 に答える 2

1

何かをスケジュールすると、セレクターとタイマーの頻度が Cocos2d に渡されsharedSchedulerます。次に、各フレームでsharedDirector呼び出します。[[Scheduler sharedScheduler] tick: dt];タイマーがしきい値を超えると、スケジューラはセレクターを呼び出します。

そのため、周波数をメインループ周波数より正確にすることはできません (最大 1/60、最小 - 実際のシーンの複雑さに応じて)。おそらく 1/30 パスのしきい値は 2 番目のフレームごとに正確ではないため、ログに正確な値がないのはそのためです。

NSTimerCocos2d スケジューラを使用せずに、別のスレッドでセレクタを呼び出すことを提案できます。

于 2012-08-09T07:33:08.080 に答える
0

iOS はリアルタイム オペレーティング システムではないため、スケジュールされたコールバック/NSTimer/etc. 正確に 1/30 秒で発生します。この精度は、OS が他に何を処理しているかによって常に異なります。

ただし、できることは、各コールバック間で経過した実際の時間を使用して、この一貫性の欠如を説明することです。

于 2012-08-09T05:03:21.370 に答える