【发布时间】:2014-01-03 01:44:15
【问题描述】:
我正在构建一个滚动菜单,它可以动态生成新的按钮行,并且必须从大量精灵中生成每个按钮。因为这是处理器密集型的,所以每次需要加载新的一行按钮时,菜单都会停留大约四分之一秒。我意识到我需要添加多线程,以便按钮加载可以在与滚动动画不同的线程中处理,但是当我这样做时,它会在尝试加载新按钮时崩溃。这是我正在使用的代码:
-(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 对象的操作),因为引擎正在处理它们,而您自己的线程可能正在执行其他操作。您可以在初始化场景中预加载所有精灵,将它们存储在某个容器(模型?)中,然后在需要时将它们带入/取出?
-
您是在需要时动态创建精灵还是预加载它们?它们是在精灵表中还是在单个文件中?如果可能的话,你的精灵应该在一个精灵表中......它确实节省了 gpu 周期,因为它不必切换纹理输入/输出。
-
是的,我所有的精灵都在一张精灵表中。绘制调用显示为 1。问题不是精灵本身,而是我需要一次显示的精灵数量以及它们的位置计算。每个按钮包含数百个精灵。我会预先创建精灵对象,并在滚动时简单地显示和隐藏它们,这是个好主意。
标签: ios iphone cocos2d-iphone grand-central-dispatch