Загрузка текстур в другом потоке с использованием detachNewThreadSelector - PullRequest
0 голосов
/ 03 декабря 2011

Я загружаю 3D-модель в приложение для iPhone. поскольку модели могут быть большими, я хочу загрузить их в другой поток. Я вызвал detachNewThreadSelector для создания нового потока и просто перенес туда вызов загрузки модели. Модель загружается, но не имеет текстур. Когда я проверяю в отладчике, я вижу, что вызов glGenTextures не создает новое имя / идентификатор (он остается действительным в 0).

Если я перенесу вызов функции в основной поток, все будет нормально.

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

OpenGL работает только при создании контекста OpenGL, и контекст становится текущим только для одного потока, поэтому, чтобы использовать OpenGL в другом потоке, вы должны создать другой контекст для этого потока и сделать его текущим в этом потоке.

Также обычно можно делить ресурсы (через что-то похожее на wglShareLists) между контекстами.

0 голосов
/ 04 декабря 2011

Я сделал это с помощью sharegroup. Вот код, который сделал это для меня:

Основная нить:

[NSThread detachNewThreadSelector: @selector (загрузить :) toTarget: [класс AsynchModelLoader] 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 = [Импортер из ресурса: @ "model3d"];

[сток в бассейне]; } * * Тысяча двадцать-один

...