是否必须使用计时器来绘制OPENGL ES

时间:2011-09-30 05:40:30

标签: ios4 opengl-es rendering nstimer

我有一个名为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行并在startAnimation方法中取消注释第2行,我将无法将对象呈现给我的屏幕。我认为渲染可能需要不断调用gameLoop metod。但即使我将计时器设置为不重复(因此重新设置:否)也会绘制对象。这意味着只调用一次gameLoop方法,但是从NStimer对象就足够了。但是如果我手动调用gameLoop方法,我就不会得到绘制的对象。我尝试在循环中调用该方法,该循环执行100次。它也没有帮助。关于OPENGL的计时器有什么特别之处吗?很抱歉这个问题太不成熟了。

2 个答案:

答案 0 :(得分:1)

OpenGL ES不需要计时器。对于我的绘图应用程序,每次用户触摸屏幕时都会调用render方法。

但是,对于游戏,大多数开发人员使用CADisplayLink来调用render或gameloop方法而不是NSTimer,因为每次屏幕刷新时CADisplayLink都会调用render方法。

设置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];
}

答案 1 :(得分:1)

已经有一段时间了,但问题是时间间隔设置为1/60,因为它使用了整数除法。你应该改用1.0 / 60.0。