У меня есть прекрасный фрагмент кода 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];
Мне это тоже кажется нормальным. Когда я запускаю этот код, в консоли я получаю сообщение о том, что состояние моего фреймбуфера было ошибочным, с нулевым состоянием. Понятия не имею почему. В результате я получаю чистое изображение (кстати, сохранение в временные файлы работает, я их проверял).
Чтобы проверить, я поместил весь этот код в основной поток, не создавая новых потоков или чего-либо еще. Все работало нормально. Как только я пытаюсь передать генерацию изображения другому потоку, у меня возникают проблемы.