0

我正在尝试创建在单独线程中运行的游戏循环。我决定使用NSThreadobject 而不是CADisplayLinkand NSTimer
为了测试是否OpenGLES正常工作,我用纯色清除屏幕。
这里的问题是一切正常,没有循环,来自initWithFrame. 但是当我将渲染代码放入游戏循环中,或者只是创建新线程并从新线程调用渲染代码时,屏幕上什么也没有发生。
这是我initWithFrameAppDelegate's调用的函数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,一切正常。但是在当前的实现中,我得到了黑屏,尽管调用了渲染函数。我也尝试过使用

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(render) object:nil];
[thread start];

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

4

2 回答 2

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
于 2013-08-19T10:43:02.903 回答
-1

添加 [EaglContext setCurrentContext:eaglobject];

于 2015-07-09T08:46:37.953 回答