OpenGLES не может генерировать кадровые буферы в потоке iPhone - PullRequest
0 голосов
/ 22 июля 2010

У меня есть прекрасный фрагмент кода OpenGLES, который отображает изображения для меня. Когда я хочу, я могу вызвать функцию:

-(UIImage *)renderToImage;

Это делает большую работу рендеринга и возвращает мне изображение. Это включает в себя создание FBO, текстур и т. Д.

В последнее время я обнаружил, что мне нужно улучшить это. Генерация изображения занимает четыре секунды, поэтому я хочу передать работу другому потоку и позволить приложению продолжить. Это казалось достаточно простым. Я сделал метод с этим кодом:

-(void) generateRandomNewImage:(MyViewController *)evc{
UIImage * renderedImage = [self renderToImage];
NSString * fileLoc = [self writeToTempFile:renderedImage];
NSLog(@"File location:%@",fileLoc);
[evc performSelectorOnMainThread:@selector(imageGenerationComplete:) withObject:fileLoc waitUntilDone:NO];
}

Надеюсь, вы сможете увидеть здесь логику. Этот метод визуализирует изображение, сохраняет его в файловой системе и вызывает метод в контроллере представления основного потока, чтобы сообщить ему, что файл готов. Этот код внутри моего рендерера opengl. Это называется здесь, в viewcontroller основного потока:

thread = [[NSThread alloc] initWithTarget:renderer 
                           selector:@selector(generateRandomNewImage:) 
                           object:self];
[thread start];

Мне это тоже кажется нормальным. Когда я запускаю этот код, в консоли я получаю сообщение о том, что состояние моего фреймбуфера было ошибочным, с нулевым состоянием. Понятия не имею почему. В результате я получаю чистое изображение (кстати, сохранение в временные файлы работает, я их проверял).

Чтобы проверить, я поместил весь этот код в основной поток, не создавая новых потоков или чего-либо еще. Все работало нормально. Как только я пытаюсь передать генерацию изображения другому потоку, у меня возникают проблемы.

1 Ответ

2 голосов
/ 22 июля 2010

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

* 1002Решение: создайте другой контекст OpenGL для второго потока и прочитайте this .
...