我有一个OpenGL ios应用程序,我建立在71squared.com教程中使用的框架之上
所有视图,状态,控件都是在应用程序中进行状态管理的,并且只有一个UIViewController。
基本游戏循环结构如下;
GameAppDelegate - 它包含UIView glView,并在applicationDidFinishLaunching中启动它,如下所示;
[glView performSelectorOnMainThread:@selector(mainGameLoop) withObject:nil waitUntilDone:NO];
GLView包含mainGameLoop方法,派生自UIView
主游戏循环执行以下操作,以及创建然后释放自动释放池和管理帧计数器;
while(true)
{
[gameController updateScene];
[self drawView];
}
gameController是一个UIViewController派生类。
drawView执行以下操作;
[EAGLContext setCurrentContext:context];
glBindFrameBufferOES(GL_FRAMEBUFFER_OES, viewFrameBuffer);
[gameController renderScene];
glBindRenderBufferOES(GL_RENDERBUFFER_OES, viewRenderBuffer);
[context presentRenderBuffer:GL_RENDERBUFFER_OES];
好的......好一点。
但是,我试图展示一个游戏中心排行榜,它什么都不做。我有一种感觉,我可能需要管理状态,并在呈现排行榜时在渲染循环中做一些不同的事情。以下代码是我的UIViewController gameController;
GKGameCenterViewController* gameCenterViewController = [[GKGameCenterViewControler alloc] init];
gameCenterController.viewState = GKGameCenterViewControllerStateLeaderboards;
[self presentViewController:gameCenterController animated:NO completion:nil];
代码运行,但没有显示任何内容,游戏循环只会继续。为什么不呢?
修改
尝试通过NSTimer和CADisplayLink触发主游戏循环但没有成功,presentViewController仍然没有出现。
答案 0 :(得分:0)
好的,问题是主线程始终忙于while(true)
。
下次我想建议您使用GLKit。它非常简单,Xcode中的模板具有简单应用所需的一切。
在目前的情况下,你需要创建绘图循环,它有两种不同的方式:
1.创建CADisplayLink - 更好,here you can grab code
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(mainGameLoop)];
[displayLink setFrameInterval:2];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
2。简单用间隔创建NSTimer,每次迭代都会调用mainGameLoop,但它不是那么完美的解决方案
在这里你可以找到一些有趣的,Jeff Lamarche有很多很好的教程和解释
https://github.com/jlamarche/iOS-OpenGLES-Stuff
http://iphonedevelopment.blogspot.ie/