使用NSThread创建游戏循环

时间:2013-08-19 09:57:45

标签: ios opengl-es-2.0 nsthread

我正在尝试创建在单独的线程中运行的游戏循环。我决定使用NSThread对象而不是CADisplayLinkNSTimer 要测试OpenGLES是否正常工作,我将用纯色清除屏幕 这里的问题是所有工作正常,没有循环,来自initWithFrame的单个渲染调用。但是当我将渲染代码放入游戏循环中,或者只是简单地创建新线程并从新线程调用渲染代码时,屏幕上没有任何反应。
以下是我的initWithFrame函数,该函数从AppDelegate的{​​{1}}调用:

didFinishLaunchingWithOptions

这是渲染功能:

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
    [self setupLayer];
    [self setupContext];
    [self setScaleFactor];      
    [self initGame];
    [NSThread detachNewThreadSelector:@selector(render) toTarget:self withObject:nil];
}
return self;
}

如果我在- (void)render { glClearColor(1.0f, 0.0f, 1.0f, 1.0); glClear(GL_COLOR_BUFFER_BIT); [context presentRenderbuffer:GL_RENDERBUFFER]; } 内放置渲染调用而不是创建线程,那么一切正常。但是在目前的实现中我得到黑屏,尽管调用了渲染功能。 我也尝试过使用

initWithFrame

也不会出现粉红色的画面。
感谢任何建议如何使用线程将OpenGl ES渲染到屏幕上。

2 个答案:

答案 0 :(得分:0)

试试这个:

@interface GameObject
{
  BOOL hasStoppedRendering;
}

@end

@implementation GameObject

- (id)initWithFrame:(CGRect)frame
{
   self = [super initWithFrame:frame];
   if (self)
   {
    [self setupLayer];
    [self setupContext];
    [self setScaleFactor];      
    [self initGame];
    [NSThread detachNewThreadSelector:@selector(render) toTarget:self withObject:nil];
   }
  return self;
}

- (void)render
{
    while(!hasStoppedRendering)
    {
      /*BEGIN RENDERING CODE*/
          glClearColor(1.0f, 0.0f, 1.0f, 1.0);
          glClear(GL_COLOR_BUFFER_BIT);
      /*END RENDERING CODE*/

     [self performSelector:@selector(presentRenderBuffer) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES]; 
    }

}

- (void)presentRenderBuffer
{
  [context presentRenderbuffer:GL_RENDERBUFFER];
}


@end

答案 1 :(得分:-1)

添加[EaglContext setCurrentContext:eaglobject];