ios - 尝试将 dispatch_async 与 cocos2d 函数一起使用时出错

标签 ios iphone cocos2d-iphone grand-central-dispatch

我正在构建一个滚动菜单,它可以动态生成新的按钮行,并且必须从大量 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/

相关文章:

ios - 将 uiimage 设置为 nil 不会使用 ARC 释放内存

ios - Swift Alamofire 转义 JSON

ios - 区分触摸计数SKSpriteNode

iphone - iOS 6 上的 Cocos2D 2.0 截图

ios - facebook 解析快速注册

iphone - 是否可以在不询问设备 ID 的情况下为 iPhone 提供临时构建?

iphone - 如何从粘贴板中获取复制的图像?

ios - 如何在IOS中获取上次通话的详细信息

iphone - ConvertToWorld-/NodeSpace 如何工作?

ios - 在 Swift 中为 UIAlertController 设置背景颜色