2011-09-30 83 views
0

计时器我有一个名为startAnimation方法:是强制性的绘制OpenGL ES的

-(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方法。但即使我将计时器设置为不重复(因此重复:NO)对象被绘制。这意味着只调用一次gameLoop方法,但是从一个NStimer对象就足够了。但是如果我手动调用gameLoop方法,我不会得到绘制的对象。我试着在执行100次的循环内调用该方法。它也没有帮助。对于使用OPENGL的定时器有没有什么特别之处?对于这个问题,如果它太不成熟,这个问题很抱歉。

回答

1

It's了一些时间,因为你问,但问题有,时间间隔设置为1/60,这是0因为它使用整数除法。您应该使用1.0/60.0。

+0

非常感谢。它确实解决了这个问题,尽管我已经忘记了这个问题。欢迎来到StackOverflow。 –

1

将定时器不需要的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]; 
} 
+0

谢谢@robhasacamera的交代,我知道我应该更喜欢CADisplayLink到的NSTimer,但我的主要问题仍然悬而未决。毕竟NSTimer和CADisplayLink都以不同的方式做同样的事情。你说在OpenGL中使用计时器不是强制性的。那么问题中提供的案例如何发生? –

+0

我有点困惑,以及所有的计时器是以设定的时间间隔调用方法。它与手动调用时相同([self gameLoop])。你能提供更多的代码吗?您的示例中可能没有包含某些内容来解释此行为。 – robhasacamera