使用detachNewThreadSelector在另一个线程中加载纹理

时间:2011-12-03 17:57:31

标签: opengl-es textures nsthread

我在我的iPhone应用程序中加载3D模型。因为模型可以很大,我想在另一个线程中加载它。我调用detachNewThreadSelector来生成新线程并简单地移动模型加载调用。模型加载但没有纹理。当我检入调试器时,我看到glGenTextures调用没有创建新的名称/ Id(它在0处保留可用值)。

如果我将函数调用移动到主线程,则一切正常。

2 个答案:

答案 0 :(得分:1)

OpenGL仅在创建OpenGL上下文时有效,并且上下文仅对一个线程成为当前,因此要在另一个线程中使用OpenGL,您必须为该线程创建另一个上下文,并使其在该线程中保持最新。

通常在上下文之间共享资源(通过类似于wglShareLists的东西)。

答案 1 :(得分:0)

我是使用sharegroup完成的。这是为我做的代码:

主线程:

  

[NSThread detachNewThreadSelector:@selector(load :)   toTarget:[AsynchModelLoader class] withObject:self];

产生线程:

  

+(void)load:(id)param {
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  ModelViewer * mview =(ModelViewer *)param;

     

EAGLContext * aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1   sharegroup:mview.context.sharegroup];
  [EAGLContext setCurrentContext:aContext];

     

mview.lib = [Importer fromResource:@“model3d”];

     

[游泳池排水];   }