2012-07-25 15 views
17

私は最初のiOSゲームの最中です。オブジェクトの動きを統合する最良の方法については苦労しています。NSTimerとCACurrentMediaTime()

ゲームは、高速に動くオブジェクトと、一定の高速のユーザー入力の変更に大きく依存しています。そのため、私はオブジェクト統合を行い、制約ソルバをできるだけ迅速かつ正確に実行しようとしています(連続するゲームループ呼び出しの間のユーザー入力の変更を最小限に抑えるため)。

具体的には、NSTimerクラスとCACurrentMediaTime()関数の機能が不明です。どちらが大きなエラーを持っているかわからないので、経験的にテストするのは難しいです。たとえば、繰り返し間隔0.008(〜2回/画面更新)のNSTimerを使用し、連続コールでCACurrentMediaTime()を呼び出すと、コール間の時間間隔が0.0075 - 0.009になることがわかります。どちらかといえば、(小さな)不一致の原因となっています。だから、時間ステップを決定するために、私は次のようになります。

  1. はNSTimerは、連続する間の時間間隔を決定するためにゲームループの時間ステップ

  2. 利用CACurrentMediaTime()としてNSTimerの時間間隔を使用するのに十分正確であると仮定しますゲームループコール。

生徒とこのすべてに新しい - してください:)すべてのアドバイスをいただければ幸いです。御時間ありがとうございます。

答えて

35

NSTimerは、リアルタイムタイマーではありません。それは近いものではなく、そうでないことも意味しません。約0.5秒以上の速さであれば、NSTimerは間違ったツールです。私は2番目のもののためにそれをお勧めしません。マルチ秒のもの、特にマルチ分のものについては、いつ発射するかを気にかけなくても大丈夫です。私はいつも使っています。

CACurrentMediaTime()はタイマーではありません。これは、システム内の最も正確な時刻関数を包むラッパーです:mach_absolute_time()。ですから、あなたが実際に何時になっているか気にしていれば、それを人間が理解できる数字にしたいのですが、CACurrentMediaTime()があなたの機能です。 mach_absolute_time()はあなたに本当に正確な数字を与えるでしょうが、それは実際に人間が考える奇妙なもの(そしてすべてのCPUが異なるスケールを持っている)にマップしていないMach absolute time unitに基づいています。だから私たちの生活を楽にするためにCACurrentMediaTime()があるのです。

だから、NSTimerはリアルタイムではなく、CACurrentMediaTime()はタイマーではありません。ゲームプログラマーは何をするのですか?

Grand Central Dispatchには、私たちが持っているシステムの中で最高の「今実行する」システムが含まれています。それは派遣元です。 GCDはまだRTOSの人がそれを意味する方法で本当に "リアルタイム"ではないので、私は "この時間について"と言います。しかし、ゲーム開発者にとってはリアルタイムで十分です。 Concurrency Programming Guideでタイマーを作成します。また、dispatch_after()を見てください。これはワンショットに適しています。「遅れて実行してください。"

メインスレッド(すべての描画が完了したUIスレッド)で実行されるものは、そのスレッド上の他のすべてのものと時間を共有することを覚えておいてください。しばしば計算を行う必要がありますあなたがメインスレッド上で描画とユーザーのやりとりを処理している間に、バックグラウンドスレッドでGCDディスパッチキューがあなたを助けるように設計されているのですが、一方、多くのiOSデバイスはシングルコアなので、 GPUに動かすことは非常に重要なのです(下記参照)

あなたは真剣にシステムを見てみたいと思うかもしれませんcocos2dのような、非常に優れたゲームエンジンです。あなたのための詳細のe種類とゲームの部分に集中することができます。

アップルのフレームワークを利用する場合、Core Animationもご覧ください。あなたがタイマーで画面上を動かしているなら、あなたはそれをしてはいけません。 Core Animationは、画面上で物を動かす方法です。それはあなたのための多くの細部を、素早く、自分でやるよりはるかに少ないバッテリーを使用して処理し、GPUに多くの作業を(上記のように)移動します。それはUI要素のためにゲームよりも少し設計されていますが、単純なゲームを作るためには間違いなく使用できます。

もちろんGLKitがありますが、それはまったく別のものです....

+3

Hey Rob、ありがとう、素晴らしい答え!私は本当にあなたが読んで徹底的に対応する時間を割いていただき、ありがとうございます。ありがとう! –

+0

詳細な対応をありがとう!簡単な説明:以下の答えの1つとして、NSTimerの文書では、タイマーの時間間隔の有効な解決は50-100ミリ秒のオーダーに制限されていると主張しています。NSTimerを避けるためのNSTimerの提案はまだ成立していますか?今日?再度、感謝します! – Crashalot

+1

私はまだ高速なNSTimersを使用しませんでした(確かにセレクタではありません)。実行ループとディスパッチのオーバヘッドはあまりにも過剰に見えます。私はちょっと慎重すぎるかもしれませんが、NSTimerは間違ったツールのようです。 (ブロックベースのインターフェースがありますが、おそらくループを走らせるよりもGCDの上に構築されているでしょうから、それらはおそらく完全にうまくいきますが、私は新しいインターフェースを多く探っていません)。 –

2

NSTimer documentationthe effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds.によると、おそらく時間間隔の変化が見られます。

あなたのゲームの状態が画面よりも頻繁に更新される理由がないため、更新間隔を0.016秒に変更することをお勧めします。次に、CADisplayLinkを使用してタイミングを処理できます。これは、ディスプレイリフレッシュレートを使用しているので非常に正確です。