9

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

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

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

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

必须做什么才能允许多个线程使用 Cocos2D-iPhone 在 iPhone 上进行 OpenGL 调用。

4

4 回答 4

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方法已过时,该方法为您执行异步纹理加载。

于 2010-01-19T13:22:17.040 回答
2

我也想这样做。

我从这个线程开始。

PS:这个答案很老了,现在我不确定异步纹理加载是否像以前那样有用,因为 iOS5 通过CVOpenGLESTextureCaches. 当然,您仍然可以(并且应该)在辅助线程中加载您的资产,但EAGLContext现在似乎没有必要给该线程提供一个。

于 2009-07-15T22:57:15.277 回答
2

Apple在这里为多线程 OpenGL 提供了一些很好的指南。

于 2009-07-16T00:35:23.573 回答
-1

Cocos2d最佳实践建议不要使用 NSTimer,我认为这同样适用于线程。您可能应该使用 Cocos 的Timer 对象。这会将线程管理留给 Cocos,并且还应该让您访问正确的图形上下文。HTH。

于 2009-07-16T00:42:39.660 回答