Я делаю приложение для 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-битный), но безуспешно.
Любые идеи приветствуются, спасибо
EDIT
Подробнее:
контекст opengl используется всеми моими экранами. Я делаю это, чтобы мои шейдеры и текстуры загружались между экранами.
вышеуказанная проблема возникает при переходе ко второму экрану. На первом экране я рисую текстурные вещи без проблем (хотя другие текстуры).
Проблема выше возникает, когда я загружаю свой контент (игровые объекты) в игровой мир. Каждый объект пытается загрузить текстуру. У меня есть простая система кэширования, которая загружает текстуру только один раз, а затем возвращает тот же идентификатор для всех других объектов. Я загружаю объекты синхронно, одним способом. Первая сущность не может загрузить текстуру, затем идет вторая и успешно, а третья получает кэшированный идентификатор.
Я вызываю метод загрузки сущностей в viewDidAppear
, и я пытался добавить режим ожидания на 2 секунды, прежде чем загружать какие-либо сущности, но ничего не изменилось.
EDIT:
Код загрузки текстуры:
- (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;
}