Я делаю приложение iPhone с OpenGL ES 2.0 с помощью GLKit. Я использую GLKTextureLoader для синхронного загрузки текстур.GLKTextureLoader сбой при загрузке определенной текстуры в первый раз, но второй раз завершается
Проблема в том, что для определенной текстуры она не может загрузить ее в первый раз. Он дает эту ошибку:
The operation couldn’t be completed. (GLKTextureLoaderErrorDomain error 8.)
Для этого кода ошибки, документация яблоко говорит следующее:
GLKTextureLoaderErrorUncompressedTextureUpload
An uncompressed texture could not be uploaded.
Available in iOS 5.0 and later.
Declared in GLKTextureLoader.h.
(не очень много).
Могу ли я пытаться загрузить текстуру, в то время как контекст opengl находится в каком-то занятом состоянии или что-то в этом роде?
Примечания:
- Перед тем, как загрузить эту текстуру я загрузить другие текстуры и те работы с первой попытки. Кроме того, тот же самый файл текстуры будет загружаться ок во второй попытке.
- Должно быть достаточно свободной видеопамяти, так как перед этим я имею только пару текстур.
- Текстура - несжатый PNG с альфой, но я также пробовал с TGA (24 бит & 32bit) без везения.
Любые идеи приветствуются, благодаря
EDIT:
Подробнее:
контекст OpenGL разделяется между всеми моими экранами. Я делаю это, чтобы мои шейдеры и текстуры загружались между экранами.
проблема выше бывает, когда я иду на свой второй экран. На первом экране я рисую текстурированные вещи без проблем (другие текстуры).
Проблема выше возникает, когда я загружаю свой контент (игровые сущности) в игровой мир. Каждый объект пытается загрузить текстуру. У меня есть простая система кэширования, которая загружает текстуру только один раз, а затем возвращает один и тот же идентификатор для всех других объектов. Я загружаю объекты синхронно одним способом. Первый объект не загружает текстуру, а затем второй и успешно, а затем третий получает кешированный идентификатор.
Я вызываю метод сущности загрузки в
viewDidAppear
, и я попытался добавить спать в течение 2 секунд, прежде чем загружать любые объекты, но ничего не изменилось.
EDIT:
код Texture загрузки:
- (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;
}
Вы говорите, что загружаете другие текстуры до проблемного - все это (в том числе и то, что не удается) в том же методе? если нет, вполне возможно, что текущий контекст gl не был установлен. –
благодарит за комментарий. Я добавил дополнительную информацию к вопросу –
hmm вы загружаете текстуры (а не только сущности) синхронно с чем-то вроде: + (GLKTextureInfo *) textureWithContentsOfFile: (NSString *) Параметры файла: (NSDictionary *) textureOperations error: (NSError **) outError? –