23

iPhoneでゲームをプログラミングしています。現在、ゲームの更新/レンダリングをトリガーするために NSTimer を使用しています。これに関する問題は、(プロファイリング後) 更新/レンダリングの間に多くの時間を失っているように見え、これは主に NSTimer にプラグインする時間間隔に関係しているようです。

私の質問は、NSTimer を使用するための最良の代替手段は何ですか?

回答ごとに 1 つの選択肢をお願いします。

4

3 に答える 3

18

スレッドを使用するとパフォーマンスが向上します。次のようにしてみてください。

- (void) gameLoop
{
    while (running)
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [self renderFrame];
        [pool release];
    }
}

- (void) startLoop
{
    running = YES;
#ifdef THREADED_ANIMATION
    [NSThread detachNewThreadSelector:@selector(gameLoop)
    toTarget:self withObject:nil];
#else
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f/60
    target:self selector:@selector(renderFrame) userInfo:nil repeats:YES];
#endif
}

- (void) stopLoop
{
    [timer invalidate];
    running = NO;
}

メソッドではrenderFrame、フレームバッファを準備し、フレームを描画して、フレームバッファを画面に表示します。(PSさまざまな種類のゲーム ループとその長所と短所に関する素晴らしい記事があります。)

于 2008-10-22T08:35:14.303 に答える
4

特に iPhone についてはわかりませんが、まだお役に立てるかもしれません: 単純にループの最後に固定遅延を接続する代わりに、次のようにします:

  • 満足できる更新間隔を決定し、それはメイン ループを 1 回通過するよりも長くなります。
  • ループの開始時に、利用可能な解像度の現在のタイムスタンプを取得して保存します。
  • ループの最後で、別のタイムスタンプを取得し、最後のタイムスタンプからの経過時間を決定します (ループの前にこれを初期化します)。
  • 理想的なフレーム時間とフレームのすでに経過した時間との差のスリープ/遅延。
  • 次のフレームでは、前のループの開始時のタイムスタンプと比較することで、スリープ間隔の不正確さを補正することもできます。差を保存し、このループの最後でスリープ間隔に加算/減算します (スリープ/遅延は長すぎたり短すぎたりする可能性があります)。

タイミングが厳しすぎるかどうかを知らせるアラート メカニズムが必要になる場合があります (つまり、すべての補正後の睡眠時間が 0 未満の場合、つまり、処理に時間がかかっていることを意味します)。あなたのフレームレートが許します)。その結果、ゲームの速度が低下します。追加のポイントとして、これが発生したことを検出した場合は、十分な空き容量が再び得られるまで、レンダリングをしばらく単純化することをお勧めします。

于 2008-10-22T07:58:51.163 に答える
0

CADisplayLink を使用します。XCODE で提供されている OpenGL ES テンプレート プロジェクトでその方法を見つけることができます (このテンプレートから開始するプロジェクトを作成し、EAGLView クラスを見てください。この例はオープン GL に基づいていますが、CADisplayLink は他のゲームの種類

于 2010-11-29T13:14:04.623 に答える