Я делаю приложение для 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 находится в каком-то состоянии занятости или что-то в этом роде?
Примечания:
Любые идеи приветствуются, спасибо
РЕДАКТИРОВАТЬ :
Подробнее:
контекст 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;
}