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がありますが、それはまったく別のものです....
Hey Rob、ありがとう、素晴らしい答え!私は本当にあなたが読んで徹底的に対応する時間を割いていただき、ありがとうございます。ありがとう! –
詳細な対応をありがとう!簡単な説明:以下の答えの1つとして、NSTimerの文書では、タイマーの時間間隔の有効な解決は50-100ミリ秒のオーダーに制限されていると主張しています。NSTimerを避けるためのNSTimerの提案はまだ成立していますか?今日?再度、感謝します! – Crashalot
私はまだ高速なNSTimersを使用しませんでした(確かにセレクタではありません)。実行ループとディスパッチのオーバヘッドはあまりにも過剰に見えます。私はちょっと慎重すぎるかもしれませんが、NSTimerは間違ったツールのようです。 (ブロックベースのインターフェースがありますが、おそらくループを走らせるよりもGCDの上に構築されているでしょうから、それらはおそらく完全にうまくいきますが、私は新しいインターフェースを多く探っていません)。 –