我正在构建一个滚动菜单,它可以动态生成新的按钮行,并且必须从大量 sprite 中生成每个按钮。因为这是处理器密集型的,所以每次需要加载新的一行按钮时,菜单都会停留大约四分之一秒。我意识到我需要添加多线程,这样按钮加载就可以在与滚动动画不同的线程中处理,但是当我这样做时它在尝试加载新按钮时崩溃了。这是我正在使用的代码:
-(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 函数有关?
最佳答案
您可能会遇到崩溃问题,因为您正在对 cocos 管理的对象( Sprite 、层、节点等)进行多线程访问。由于引擎希望将这些对象的内部结构用于显示、GPU 操作等,并且不是线程安全的,因此使用多线程可能不会有好的结果。 您可能正在使用它的过程中更改东西。
动态创建/销毁 sprite 可能是您速度变慢的原因。 Cocos2d 可以以 60 fps 的速度在屏幕上显示很多(我认为是 2k 的数量级)对象...只要您不通过大量创建/销毁或 AI 来限制它。
我建议您在场景上演之前预加载所有 Sprite 。您可以在介绍场景或场景本身的初始化中执行此操作,并让 Sprite 归场景所有。然后您可以在 update() 调用期间迭代它们并更改它们的位置,使可见/不可见等。
作为引用,我通常会创建不同的“sprite 层”,将它们的所有 sprite 加载到场景中。如果我要拥有动态对象,我会尝试预先分配一些并在可能的情况下回收它们。这也让我可以控制屏幕上“什么在什么前面”的顺序(see example here)。每层还绘制特定“实体类型”的元素,为大量显示提供漂亮的“MVC”特征。
这类似于 iPhone 应用程序回收表格单元格的方式。
仅在您第一次需要它们时创建它们,并在您完全需要它们之前准备好它们。
这有帮助吗?
关于ios - 尝试将 dispatch_async 与 cocos2d 函数一起使用时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20895145/