Загрузка AtlasSpriteManager в фоновых потоках не работает - PullRequest
0 голосов
/ 27 октября 2009

Я делаю игру для iPhone с использованием cocos2d, которая включает в себя огромный набор анимаций персонажей (по крайней мере, 25 различных из них) ... для которых у меня много спрайт-листов, каждый из которых весит от 100 КБ до 200 КБ ... И я использовал для создания AtlasSpriteManagers для этих по требованию. Но когда я проверил это на устройстве, вокруг этих анимаций было много сбоев в производительности ... не было кадров ... игра зависала, а изображения загружались и все ...

Поэтому я решил создать метод предварительной загрузки и кэширования, в котором я постоянно смотрю в будущее и создаю возможные AtlasSpriteManager, которые мне могут понадобиться, и поддерживаю их в NSMutableDictionary и извлекаю их оттуда во время анимации .. и основываясь на useCount переменная, я буду удалять их из этого словаря позже и освободить память .. И я использую метод executeSelectorInBackground для вызова этой функции 'loadASM', которая делает это создание AtlasSpriteManager и сохраняет его в словаре.

[self performSelectorInBackground:@selector(loadASM:) withObject:fileName];

-(ASMHolder *)loadASM:(NSString *)fileName
{
AtlasSpriteManager *sprMgr = [AtlasSpriteManager spriteManagerWithFile:fileName capacity:40];
ASMHolder *asmHolder = [[ASMHolder alloc] init];
asmHolder.sprMgr = sprMgr; asmHolder.retainCount++;
[asmDict setObject:asmHolder forKey:fileName];

return asmHolder;
}

Но изображения, кажется, не загружаются, если я вызываю этот метод в фоновом режиме, используя executeSelectorInBackground. Появляется белая цветная рамка, в которой должны появляться изображения. Однако объект AtlasSpriteManager создан и находится в словаре. ... но это просто приводит к пустым спрайтам ... И вместо фонового вызова, если я пытаюсь вызвать метод 'loadASM' напрямую (т.е. [self loadASM: fileName]), изображения загружаются ... но, конечно, есть задержка, так как это синхронный вызов ..

Я даже пытался кэшировать объекты Texture2D также вместо AtlasSpriteManager, но результат тот же ..

(Я также попытался добавить addImageAsync из TextureManager ... но это не помогает моей цели тоже ... так как оно не дает имени файла, который он загружает в аргументах метода обратного вызова, без которого невозможно создать ключ кеша моего словаря ... ) * +1010 *

Пожалуйста, помогите ..

Спасибо Sankar

1 Ответ

0 голосов
/ 28 октября 2009

вам нужно сделать особые вещи, чтобы использовать OpenGL из нескольких потоков. См этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...