0

我正在使用 XCode 5。我正在使用 Cocos2D 制作游戏。并且想让一些功能依次一个接一个地重复做。由于一次执行许多动作,因此也需要延迟(这样不会干扰下一个动作,并且不会取消前一个动作的效果或重新安排并立即执行该功能)。

我的界面冻结,在 Debug Navigator 中,CPU 消耗达到 99-100% 之间,内存逐渐增加并保持增加。我也设置了所有异常断点。但也不例外。

我正在使用此代码

-(void)threadMainRunLoop
{
    BOOL exitNow = NO;
    int loopCount = 1;
    [self function1];
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

    // Add the exitNow BOOL to the thread dictionary.
    NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
    [threadDict setValue:[NSNumber numberWithBool:exitNow] forKey:@"ThreadShouldExitNow"];

    // Install an input source.
    [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(function2) userInfo:nil repeats:NO];
    [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(function3) userInfo:nil repeats:NO];
    [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(function4) userInfo:nil repeats:NO];
    [NSTimer scheduledTimerWithTimeInterval:0.7 target:self selector:@selector(function5) userInfo:nil repeats:NO];
    [NSTimer scheduledTimerWithTimeInterval:1.2 target:self selector:@selector(function6) userInfo:nil repeats:NO];

    while (loopCount <= 4 && !exitNow)
    {
        // Do one chunk of a larger body of work here.
        // Change the value of the moreWorkToDo Boolean when done.
        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(function2) userInfo:nil repeats:NO];
        [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(function3) userInfo:nil repeats:NO];
        [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(function4) userInfo:nil repeats:NO];
        [NSTimer scheduledTimerWithTimeInterval:0.7 target:self selector:@selector(function5) userInfo:nil repeats:NO];
        [NSTimer scheduledTimerWithTimeInterval:1.2 target:self selector:@selector(function6) userInfo:nil repeats:NO];

        // Run the run loop but timeout immediately if the input source isn't waiting to fire.
        [runLoop runUntilDate:[NSDate dateWithTimeInterval:5.0 sinceDate:[NSDate date]] ];

        // Check to see if an input source handler changed the exitNow value.
        exitNow = [[threadDict valueForKey:@"ThreadShouldExitNow"] boolValue];
        ++loopCount;
    }
}

并在ccTouchesEnded:withEvent:.

我遵循了“清单 2-3 在长时间作业期间检查退出条件”的线程管理中的这段代码。

我的 NSRunLoop 是否让我的游戏/界面冻结???

记住设备没有挂起。功能 1-6 正在更新 UI。而且游戏何时会冻结是预料之中的,可能会在一段时间后或很长一段时间后甚至可能不会冻结。

提前致谢。

4

1 回答 1

0

cocos2d 不是线程安全的,所以如果这些调度函数中的任何一个在后台线程上执行 cocos2d 操作或修改节点都会出现问题。而是使用 cocos2d 的内置 scheduleSelector:interval: 方法。

这里的一个具体问题是 while 循环。您调用 runUntilDate 将主线程阻塞 5 秒,并且您最多执行 4 次。这意味着 cocos2d 和 ui 每 20 秒更新一次并绘制它们的状态。难怪应用程序冻结。

如果您想做一些多线程,请使用 performSelectorInBackground 或大型中央调度。如果您不控制应用程序的整个运行循环和所有线程,则运行循环和线程级别太低。

于 2013-10-25T10:27:56.573 回答