Как делают игровой цикл на iPhone, не используя NSTimer

Вы не должны делать никакой специальной вещи; просто извлечение от архива до некоторого каталога и запуска./затмение оттуда.

5
задан user156848 29 August 2009 в 11:43
поделиться

5 ответов

Если вы не хотите использовать NSTimer , вы можете попробовать запустить NSRunLoop вручную:

static BOOL shouldContinueGameLoop;
static void RunGameLoop() {
    NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
    NSDate *destDate = [[NSDate alloc] init];
    do {
        // Create an autorelease pool
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        // Run the runloop to process OS events
        [currentRunLoop runUntilDate:destDate];
        // Your logic/draw code goes here
        // Drain the pool
        [pool drain];
        // Calculate the new date
        NSDate *newDate = [[NSDate alloc] initWithTimeInterval:1.0f/45 sinceDate:destDate];
        [destDate release];
        destDate = newDate;
    } while(shouldContinueGameLoop);
    [destDate release];
}
2
ответ дан 18 December 2019 в 06:03
поделиться

Другой вариант с iPhoneOS 3.1 - использовать новый API CADisplayLink. Это вызовет указанный вами селектор, когда необходимо обновить содержимое экрана.

displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(renderAndUpdate)];
[displayLink setFrameInterval:2];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

Новый шаблон проекта OpenGL в XCode также использует CADisplayLink, если вам нужен еще какой-то пример кода.

21
ответ дан 18 December 2019 в 06:03
поделиться

Хотя использование CADisplayLink является действительно хорошей альтернативой для игр на основе 3.1,
все, что использует "Таймер", является действительно плохая идея.

Лучшим подходом является старая добрая «тройная буферизация» для разделения работы графического процессора.

Фабьен дал очень хорошее объяснение в своем обзоре Doom Iphone:
http://fabiensanglard.net/doomIphone/

2
ответ дан 18 December 2019 в 06:03
поделиться

Что касается статьи Фабьена CADisplayLink и Doom для iPhone, я написал Фабьену по электронной почте и считаю, что лучший вариант - субъективный. С точки зрения производительности DisplayLink и тройная буферизация должны быть одинаковыми, но DisplayLink доступен только в> OS 3.1. Так что это должно быть вашим определяющим фактором.

0
ответ дан 18 December 2019 в 06:03
поделиться

Позаботьтесь о том, чтобы использовать self в качестве цели для displayLinkWithTarget , в руководстве говорится: «Недавно созданная отображаемая ссылка сохраняет цель». Мартин

{{ 1}}
2
ответ дан 18 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: