GLKTextureLoader не работает при загрузке определенной текстуры в первый раз, но преуспевает во второй раз

Я делаю приложение для iPhone с OpenGL ES 2.0, используя GLKit. Я использую GLKTextureLoader для синхронной загрузки текстур.

Проблема в том, что некоторая текстура не загружается с первого раза. Выдает следующую ошибку:

Операция не может быть завершена. (Ошибка GLKTextureLoaderErrorDomain 8.)

Для этого кода ошибки в документации Apple указано следующее:


GLKTextureLoaderErrorUncompressedTextureUpload
An uncompressed texture could not be uploaded.
Available in iOS 5.0 and later.
Declared in GLKTextureLoader.h.

(не очень много).

Могу ли я загрузить текстуру, когда контекст opengl находится в каком-то состоянии занятости или что-то в этом роде?

Примечания:

  • Перед загрузкой этой текстуры я загружаю другие текстуры, и они работают с первой попытки . Кроме того, тот же самый файл текстуры загрузится нормально со второй попытки.
  • Свободной видеопамяти должно быть достаточно, так как до этой у меня загружена всего пара текстур.
  • Текстура представляет собой несжатый PNG с альфа-каналом, но я также безуспешно пытался с TGA (24 и 32 бит).

Любые идеи приветствуются, спасибо

РЕДАКТИРОВАТЬ :

Подробнее:

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

  • указанная выше проблема возникает, когда я перехожу на второй экран. На первом экране я без проблем рисую текстурные вещи (хотя и другие текстуры).

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

  • Я вызываю метод загрузки сущностей в viewDidAppear , и я пытался добавить засыпание на 2 секунды перед загрузкой каких-либо сущностей, но ничего не изменилось.

РЕДАКТИРОВАТЬ:

Код загрузки текстуры:


- (GLKTextureInfo *)loadTextureAtPath:(NSString*)path ofType:(NSString*)type withKey:(NSString *)key 
{
    GLKTextureInfo* tex;

    tex = [self textureWithKey:key];
    if (tex)
        return tex;

    NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithBool:NO],
                              GLKTextureLoaderOriginBottomLeft, 
                              nil];

    NSError * error;    
    NSString *bundlepath = [[NSBundle mainBundle] pathForResource:path ofType:type];

    tex = [GLKTextureLoader textureWithContentsOfFile:bundlepath options:options error:&error];
    if (tex == nil) 
        DLOG_LOCAL(@"Error loading texture: %@", [error localizedDescription]);                
    else
        [textures setObject:tex forKey:key];

    return tex;
}


10
задан Andrei Stanescu 23 December 2011 в 13:48
поделиться