24

それで、私は初めての iOS ゲームの真っ最中で、オブジェクトの動きを統合する最善の方法をどうしようかと苦労しています。

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

具体的には、NSTimer クラスと CACurrentMediaTime() 関数の機能がよくわかりません。どちらがより大きな誤差を持つかわからないため、経験的にテストするのは困難です。たとえば、0.008 の繰り返し間隔 (~2 回の更新/画面の更新) で NSTimer を使用し、連続する呼び出しで CACurrentMediaTime() を呼び出すと、呼び出し間の時間間隔が 0.0075 から 0.009 まで変化することがわかります。(小さな)不一致の原因が誰であるかを言うのは難しい. したがって、時間ステップを決定するには、次のようにする必要があります。

  1. NSTimer は、ゲーム ループのタイム ステップとして NSTimer の時間間隔を使用するのに十分正確であると仮定します。

  2. CACurrentMediaTime() を使用して、連続するゲーム ループ呼び出し間の時間間隔を決定します。

学生であり、これらすべてに不慣れです-親切にしてください:)どんなアドバイスも大歓迎です。御時間ありがとうございます。

4

2 に答える 2

40

NSTimerリアルタイムタイマーではありません。それは近くにさえありませんし、そうであることを意味するものでもありません。約 0.5 秒よりも速いものを見ている場合NSTimerは、間違ったツールです。1秒未満のものにはお勧めしません。数秒のもの、特に数分のものの場合、正確にいつ起動するかをあまり気にしない場合、それは素晴らしいことです. いつも使っています。

CACurrentMediaTime()タイマーではありません。これは、システムで最も正確な時間関数のラッパーです: mach_absolute_time(). したがって、今何時かを本当に気にし、それを人間が理解できる数字にしたい場合は、それCACurrentMediaTime()があなたの機能です。非常に正確な数値が得られますが、これはマッハmach_absolute_time()の絶対時間単位に基づいており、実際には人間が考える厄介なものにはマップされません (すべての CPU は異なるスケールを持っています)。だからこそ、私たちは生活を楽にしなければなりません。CACurrentMediaTime()

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

Grand Central Dispatchには、私たちが持っている最高の「この時点で実行する」システムの 1 つが含まれています。発送元です。私が「この頃」と言ったのは、GCD はまだ RTOS 関係者が意味する「リアルタイム」ではないからです。しかし、ゲーム開発者にとっては十分なリアルタイム性です。Concurrency Programming Guideで「Creating a Timer」を探してください。も参照してくださいdispatch_after()。これは、「後でこれを実行する」というワンショットに適しています。

メイン スレッド (すべての描画が行われる UI スレッド) で実行されるものはすべて、そのスレッド上の他のすべてのものと時間を共有することに注意してください。そのため、メイン スレッドで描画やユーザー操作を処理している間に、バックグラウンド スレッドで計算を行う必要が生じることがよくあります。これは、GCD dispatch_queues が支援するように設計されている種類のものです。一方、多くの iOS デバイスはシングルコアであることを思い出してください。したがって、「バックグラウンド スレッド」は少し誤称です。CPU で実際に一度に実行できるのは 1 つだけです。そのため、物事を GPU に移行することが非常に重要です (以下を参照)。

また、非常に優れたゲーム エンジンであるcocos2dなどのシステムを真剣に検討することもできます。この種の詳細の多くを処理し、ゲームの部分に集中できるようにします.

Apple フレームワークにとどまり、Core Animation も検討する必要があります。タイマーを使用して画面上で物事を動かしている場合は、そうすべきではありません。コア アニメーションは、画面上で物を動かす方法です。多くの詳細をあなたに代わって処理し、自分で行うよりも高速でバッテリーの消費を抑え、多くの作業を GPU に移します (前述のとおり)。ゲームというよりも UI 要素向けに設計されていますが、単純なゲームを構築するために使用することは間違いありません。

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

于 2012-07-26T02:26:19.230 に答える
4

NSTimer のドキュメント によると、the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds.おそらく時間間隔の変動が見られる理由です。

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

于 2012-07-26T02:23:48.183 に答える