我正在尝试创建在单独的线程中运行的游戏循环。我决定使用NSThread
对象而不是CADisplayLink
和NSTimer
要测试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渲染到屏幕上。
答案 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];