2013-03-04 4 views
1

Я разрабатываю приложение 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

+0

Вы не можете одновременно обращаться к одному и тому же контексту OpenGL ES из нескольких потоков, так что вы правильно блокируете, чтобы убедиться, что операции рендеринга и т. Д. Не происходят одновременно с загрузкой текстуры? Кроме того, вам нужно будет назначить свой контекст OpenGL ES потоку вашего блока GCD с помощью '-setCurrentContext: 'или не может быть допустимого контекста OpenGL ES при попытке загрузить текстуру. –

ответ

2

Обратите внимание, что в документации +textureWithContentsOfFile:options:error: включает следующее утверждение: проверить here

This class method loads the texture into the sharegroup attached to the current context for the thread this method is called on.

При вызове -textureWithContentsOfFile: из фонового потока, что поток не имеет контекста OpenGL набор (текущий контекст GL является для каждого потока состояния), и поэтому GLKit не знает, какой sharegroup загрузить текстуру в.

Но вы делаете это сложнее, чем должно быть. GLKit уже может управлять загрузкой асинхронной текстуры. Посмотрите на вариант -textureWithContentsOfFile:options:queue:completionHandler:. Вам не нужно создавать собственную очередь: вы можете просто передать основную очередь для получения уведомления, когда загрузка будет завершена.