Является ли таймер обязательным для рисования OPENGL ES - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть метод startAnimation:

-(void)startAnimation{
1:   self.animationTimer=[NSTimer scheduledTimerWithTimeInterval:1/60
     target:self selector:@selector(gameLoop)
           userInfo:nil repeats:YES];
2: //[self gameLoop]
{

Метод gameLoop выглядит следующим образом:

-(void)gameLoop{
   [self updateModel];
   [self render]
{

Теперь происходит очень странная вещь.Если я закомментирую строку 1 и раскомментирую строку 2 в методе startAnimation, я не получу объекты, отображаемые на моем экране.Я думал, что для рендеринга может потребоваться непрерывный вызов метода gameLoop.Но даже если я установлю таймер, чтобы он не повторялся (так что повторений: НЕТ) объекты рисуются.Это означает вызов метода gameLoop только один раз, но для этого достаточно NStimer-объекта.Но если я вызываю метод gameLoop вручную, объекты не отображаются.Я попытался вызвать метод внутри цикла, который выполняется 100 раз.Это тоже не помогло.Есть ли что-то особенное с таймерами в отношении OPENGL? Извините за вопрос, если он слишком незрелый.

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Прошло некоторое время с тех пор, как вы спросили, но проблема в том, что временной интервал установлен на 1/60, что равно 0, потому что он использует целочисленное деление.Вместо этого вы должны использовать 1.0 / 60.0.

1 голос
/ 30 сентября 2011

Таймер не требуется для OpenGL ES.Для моего приложения для рисования метод рендеринга вызывается каждый раз, когда пользователь касается экрана.

Однако для игр большинство разработчиков используют CADisplayLink для вызова метода рендеринга или gameloop вместо NSTimer, поскольку CADisplayLink будет каждый раз вызывать метод рендеринга.экран обновляется.

Настройка CADisplayLink выполняется, как показано в примере ниже.

- (void)setupDisplayLink {
    //this sets up the game loop to be called once each time the screen refreshes
    CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(gameLoop:)];

    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

Затем gameLoop должен быть настроен как:

- (void)gameLoop:(CADisplayLink *)displayLink {
    [self updateModel];
    [self render];
}
...