我在我的iPhone应用程序中加载3D模型。因为模型可以很大,我想在另一个线程中加载它。我调用detachNewThreadSelector来生成新线程并简单地移动模型加载调用。模型加载但没有纹理。当我检入调试器时,我看到glGenTextures调用没有创建新的名称/ Id(它在0处保留可用值)。
如果我将函数调用移动到主线程,则一切正常。
答案 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”];
[游泳池排水]; }