Многопоточное программирование OpenGL в Cocos2D-iPhone - PullRequest
9 голосов
/ 15 июля 2009

В попытке создать полосу загрузки для разрабатываемой игры для iPhone (с использованием Cocos2D) я хотел использовать многопоточный подход.

Один поток показывает экран загрузки и запускает основной цикл событий приложения, в то время как новый поток автоматически загружает все спрайты в фоновом режиме (через spriteWithFile ), а затем добавляет их в слой.

Я создаю новый поток, используя метод detachNewThreadSelector (NSThread) (который отправляет обновления статуса загрузки в основной поток через executeSelectorOnMainThread ).

Проблема, с которой я сталкиваюсь, заключается в том, что любые вызовы OpenGL (например, те, которые встречаются в методе spriteWithFile ) в новом потоке умирают с ошибкой шины или некоторой ошибкой доступа к памяти. Я предполагаю, что это потому, что оба потока пытаются сделать вызовы OpenGL одновременно, или новый поток не знает о контексте OpenGL.

Что нужно сделать, чтобы несколько потоков могли совершать вызовы OpenGL на iPhone с помощью Cocos2D-iPhone.

Ответы [ 4 ]

3 голосов
/ 19 января 2010

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

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

Это теперь устарело с помощью addImageAsync метод, предоставляемый классом TextureMgr в Cocos2D 0.8.x и далее, который выполняет асинхронную загрузку текстур.

2 голосов
/ 16 июля 2009

Я тоже хочу это сделать.

Я начинаю с этой темы .

PS: Этот ответ очень старый, теперь я не уверен, что асинхронная загрузка текстур так же полезна, как когда-то, так как iOS5 добавил «бесплатную» загрузку текстур через CVOpenGLESTextureCaches. Конечно, вы все еще можете (и должны) загружать свои активы во вторичный поток, но присвоение этому потоку EAGLContext теперь не кажется необходимым.

1 голос
/ 16 июля 2009

У Apple есть несколько хороших рекомендаций для многопоточного OpenGL здесь .

0 голосов
/ 16 июля 2009

Cocos2d лучшие практики рекомендуют не использовать NSTimer, и я предполагаю, что то же самое относится и к потокам. Возможно, вам следует использовать Cocos ' Timer object . Это оставит управление потоками для Cocos и также позволит вам получить доступ к правильному графическому контексту. НТН.

...