Я создаю меню прокрутки, которое генерирует новые строки кнопок «на лету» и должно генерировать каждую кнопку из большого количества спрайтов. Поскольку это интенсивность процессора, меню хранится около четверти секунды каждый раз, когда ему нужно загрузить новую строку кнопок. Я понял, что мне нужно добавить многопоточность, чтобы загрузка кнопки могла обрабатываться в другом потоке, чем анимация прокрутки, но когда я делаю это, она срабатывает при попытке загрузить новые кнопки. Вот код, я использую:ошибки при попытке использования dispatch_async с функциями cocos2d
-(void)addRowBelow{
_rowIndex--;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSMutableArray *row = [self addRow:_rowIndex];
[_buttonGrid addObject:row];
[self removeRow:[_buttonGrid objectAtIndex:0]];
});
_nextRowBelowPos += _rowHeight;
_nextRowAbovePos += _rowHeight;
}
Каждый раз, когда я проверить это я получаю другую ошибку, иногда это ошибка памяти или сбой утверждения. Я подозреваю, что он связан с вызовом функций cocos2d асинхронно?
Ум ... многопоточность и cocos2d обычно не хорошо подходят для спрайтов (и манипулирования другими объектами cocos2d), потому что движок делает с ними что-то, в то время как ваш собственный поток может делать что-то еще. Можете ли вы предварительно загрузить все спрайты в сцену init, сохранить их в контейнере где-нибудь (модель?), А затем просто принести их в/из, когда вам нужно? – FuzzyBunnySlippers
Вы создаете спрайты «на лету», как вам нужно, или предварительно загружая их? Являются ли они в листе спрайта или отдельных файлах? Ваши спрайты должны быть в листе спрайта, если это возможно ... это действительно экономит на циклах gpu, так как не нужно включать текстуру в/из. – FuzzyBunnySlippers
Да, все мои спрайты находятся на одном листе спрайта. Рисование вызовов показывает как 1. Это не сам спрайт, а число, которое мне нужно отобразить сразу, и расчеты их позиций. Каждая кнопка содержит несколько сотен спрайтов. Я предваряю предварительное создание объектов спрайтов заранее и просто показывая и скрывая их при прокрутке, это хорошая идея. –