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