Cocos2D-iPhone中的多线程OpenGL编程

时间:2009-07-15 18:32:54

标签: iphone multithreading opengl-es cocos2d-iphone

为了尝试为我正在开发的iPhone游戏创建加载栏(使用Cocos2D),我想使用多线程方法。

一个线程显示加载屏幕并运行主应用程序事件循环,而新线程在后台静默加载所有Sprite(通过 spriteWithFile ),然后将它们添加到图层。

我使用NSThread的 detachNewThreadSelector 方法创建新线程(通过 performSelectorOnMainThread 将加载状态的更新发送到主线程)。

我面临的问题是新线程中的任何OpenGL调用(例如在 spriteWithFile 方法中找到的那些调用)都会出现BUS ERROR或某种类型的内存访问错误。我假设这是因为两个线程都试图同时进行OpenGL调用,或者新线程不知道OpenGL上下文。

允许多个线程使用Cocos2D-iPhone在iPhone上进行OpenGL调用需要做些什么。

4 个答案:

答案 0 :(得分:3)

对于记录,新线程需要执行以下两行才能从并发线程中使用OpenGL API:

EAGLContext *k_context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:[[[[Director sharedDirector] openGLView] context] sharegroup]] autorelease];
[EAGLContext setCurrentContext:k_context];

现在,Cocos2D 0.8.x及更高版本的TextureMgr类提供的 addImageAsync 方法已经过时了,它为您执行异步纹理加载。

答案 1 :(得分:2)

我也想这样做。

我从this thread开始。

PS:这个答案非常陈旧,现在我不确定异步纹理加载是否像以前一样有用,因为iOS5通过CVOpenGLESTextureCaches添加了“免费”纹理上传。当然你仍然可以(并且应该)在次要线程中加载你的资产,但现在似乎没有必要给那个线程EAGLContext

答案 2 :(得分:1)

Apple对多线程OpenGL here有一些很好的指导。

答案 3 :(得分:-1)

Cocos2d best practices建议不要使用NSTimer,我也假设这同样适用于线程。您应该使用Cocos'Timer object。这将使线程管理留给Cocos,并且还应该让您访问正确的图形上下文。 HTH。