Cocos2d iphone cocos2d iphone操作被正在进行的操作中断

Cocos2d iphone cocos2d iphone操作被正在进行的操作中断,cocos2d-iphone,action,nsthread,Cocos2d Iphone,Action,Nsthread,我想运行一个动作,同时继续处理游戏逻辑,但在这个过程中动作会被中断。我试图使用线程,但无法使其工作。当不需要处理游戏逻辑时,精灵会像我预期的那样移动,但当需要在动作期间进行一些操作时,动作会在操作期间中断。操作结束后,操作将继续。 我做错了什么 我按如下方式调用选择器-选择器启动操作 [NSThread detachNewThreadSelector:@selector(moveSprite:) toTarget:self

我想运行一个动作,同时继续处理游戏逻辑,但在这个过程中动作会被中断。我试图使用线程,但无法使其工作。当不需要处理游戏逻辑时,精灵会像我预期的那样移动,但当需要在动作期间进行一些操作时,动作会在操作期间中断。操作结束后,操作将继续。 我做错了什么

我按如下方式调用选择器-选择器启动操作

[NSThread detachNewThreadSelector:@selector(moveSprite:)
                         toTarget:self
                       withObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                                   sprite, @"sprite",
                                                   [NSValue valueWithCGPoint:pos], @"pos",
                                                   nil]];


-(void) moveSprite: (NSDictionary*) parameters {
    CCSprite *sprite = [parameters objectForKey:@"sprite"];
    CGPoint pos = [[parameters objectForKey:@"pos"] CGPointValue];
    id actionMove = [CCMoveTo actionWithDuration:0.4f position:pos];
    id actionMoveDone = [CCCallFuncND actionWithTarget:self selector:@selector(removeSprite:data:) data:(__bridge void*)sprite];
    [sprite runAction:[CCSequence actions:actionMove, actionMoveDone, nil]];
}
动作结束后,我通过以下方法移除精灵

-(void) removeSprite: (id)sender data:(void*)data {
    CCSprite *sprite = (__bridge CCSprite*)data;
    [self removeChild:sprite cleanup:YES];
}

Cocos2d在主线程上运行,您的繁重操作也在主线程上运行,因此您所经历的是非常正常的


您应该使操作更轻松,或者使用线程,因此您的CCActions代码不是您应该寻找的,因为您知道如果没有代价高昂的操作,它可以正常工作。首先,在单独的线程中创建操作是没有意义的。操作将添加到节点,并且节点及其操作将在主线程上更新

您还应该知道,只有当设备具有两个或更多CPU内核时,线程技术才会对您有所帮助。在单核设备(iPhone4或更早版本、iPodtouch4或更早版本、iPad1)上,如果不停止主线程,运行执行重载操作的独立线程仍会减慢速度


如果你的游戏逻辑是如此之重以至于它实际上停止了屏幕更新,那么你需要优化你正在做的一切。您可以将计算分散到多个帧、配置文件,以查看是否可以优化,或者是否使用暴力方法研究更聪明、更简单但更快的算法。

此外,您还需要显示导致阻塞的游戏逻辑部分。阻止游戏渲染一定非常激烈。我不知道接受的原因。谢谢你的警告。实际上,我以为当我为初始化操作的方法创建线程时,操作将与主线程并行工作,并且操作不会被主线程中断。我是否也应该在其他操作中使用线程?最好避免使用线程,并首先使代价高昂的函数更轻。我正在迭代可变数组,并使用对象的属性进行比较,同时我正在创建新的可变数组。我猜数组操作会停止主线程。我将尝试优化操作。