Я разрабатываю приложение IPhone OpengGL с помощью GLKit, и используя следующий код для создания текстур:IPhone: GLKTextureInfo не работает с использованием Grand Central Dispatch?
NSRange dotRange = [textureFileName rangeOfString:@"." options:NSCaseInsensitiveSearch];
if (dotRange.location == NSNotFound){
NSLog(@"OpenGLDRawMaterial:createTextureFromFileName, incorrect file name given in inputs");
return nil;
}
GLKTextureInfo *newTexture;
NSError *error = nil; // stores the error message if we mess up
NSString *bundlepath = [[NSBundle mainBundle] pathForResource:[textureFileName substringToIndex:dotRange.location]
ofType:[textureFileName substringFromIndex:(dotRange.location+1)]];
newTexture = [GLKTextureLoader textureWithContentsOfFile:bundlepath options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:GLKTextureLoaderOriginBottomLeft] error:&error];
код работает очень хорошо, до тех пор, как она работает в основном потоке. Каждый раз, когда я пытаюсь заставить его работать в рабочем потоке, я получаю следующее сообщение:
«2013-03-04 02: 09: 01.528 Puppeteer [7063: 1503] Ошибка загрузки текстуры с изображения: Ошибка домена = GLKTextureLoaderErrorDomain Code = 17 «Операция не может быть выполнена. (GLKTextureLoaderErrorDomain ошибка 17.) «UserInfo = 0x1c5977e0»
код я использую для большого очереди центральный диспетчерский является:
dispatch_queue_t backgroundQueue = dispatch_queue_create("loadPlayViewBackgroundTexture", 0);
dispatch_async(backgroundQueue, ^{
[self createTexturesForPlayView]; // method calling texture creation
dispatch_async(dispatch_get_main_queue(), ^{
});
});
dispatch_release(backgroundQueue);
Если у вас есть какие-либо идеи или идеи, как решить эту проблему и имеют текстуры загружается в фоновом режиме я бы очень благодарен :) Приветствия, Stephane
Вы не можете одновременно обращаться к одному и тому же контексту OpenGL ES из нескольких потоков, так что вы правильно блокируете, чтобы убедиться, что операции рендеринга и т. Д. Не происходят одновременно с загрузкой текстуры? Кроме того, вам нужно будет назначить свой контекст OpenGL ES потоку вашего блока GCD с помощью '-setCurrentContext: 'или не может быть допустимого контекста OpenGL ES при попытке загрузить текстуру. –