iPhoneでゲームをプログラミングしています。現在、ゲームの更新/レンダリングをトリガーするために NSTimer を使用しています。これに関する問題は、(プロファイリング後) 更新/レンダリングの間に多くの時間を失っているように見え、これは主に NSTimer にプラグインする時間間隔に関係しているようです。
私の質問は、NSTimer を使用するための最良の代替手段は何ですか?
回答ごとに 1 つの選択肢をお願いします。
iPhoneでゲームをプログラミングしています。現在、ゲームの更新/レンダリングをトリガーするために NSTimer を使用しています。これに関する問題は、(プロファイリング後) 更新/レンダリングの間に多くの時間を失っているように見え、これは主に NSTimer にプラグインする時間間隔に関係しているようです。
私の質問は、NSTimer を使用するための最良の代替手段は何ですか?
回答ごとに 1 つの選択肢をお願いします。
スレッドを使用するとパフォーマンスが向上します。次のようにしてみてください。
- (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さまざまな種類のゲーム ループとその長所と短所に関する素晴らしい記事があります。)
特に iPhone についてはわかりませんが、まだお役に立てるかもしれません: 単純にループの最後に固定遅延を接続する代わりに、次のようにします:
タイミングが厳しすぎるかどうかを知らせるアラート メカニズムが必要になる場合があります (つまり、すべての補正後の睡眠時間が 0 未満の場合、つまり、処理に時間がかかっていることを意味します)。あなたのフレームレートが許します)。その結果、ゲームの速度が低下します。追加のポイントとして、これが発生したことを検出した場合は、十分な空き容量が再び得られるまで、レンダリングをしばらく単純化することをお勧めします。
CADisplayLink を使用します。XCODE で提供されている OpenGL ES テンプレート プロジェクトでその方法を見つけることができます (このテンプレートから開始するプロジェクトを作成し、EAGLView クラスを見てください。この例はオープン GL に基づいていますが、CADisplayLink は他のゲームの種類