我有一个名为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的计时器有什么特别之处吗?很抱歉这个问题太不成熟了。
答案 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。