Я делаю приложение для iPhone с OpenGL ES 2.0, используя GLKit. Я использую GLKTextureLoader для синхронной загрузки текстур.
Проблема в том, что некоторая текстура не загружается с первого раза. Это дает эту ошибку:
The operation couldn’t be completed. (GLKTextureLoaderErrorDomain error 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;
}