2013-10-25 6 views
0

Я использую XCode 5. Я делаю игру с помощью Cocos2D. И хотите, чтобы некоторые функции повторялись последовательно и один за другим. Из-за многих действий, выполняемых одновременно, так же требуется и задержка (с помощью которой никакое действие не мешает следующему, а не отменяет эффект предыдущего или пересматривает и выполняет функцию немедленно).приложение зависает, а не устройство зависает. В игре с использованием cocos2d

Интерфейс My замерзает, а в Debug Navigator потребление процессора достигает 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:.

Я выполнил этот код из Thread Management из «Листинг 2-3 Проверка условия выхода в течение длительного времени».

Является ли мой NSRunLoop моей игрой/интерфейсом для замораживания ???

Помните устройство в вешалке. И функции1-6 обновляют пользовательский интерфейс. А также, когда игра замерзнет, ​​не ожидается, может быть через какое-то время или после долгого времени или даже может не замерзнуть.

Заранее благодарен.

ответ

0

cocos2d не является потокобезопасным, поэтому, если какая-либо из этих запланированных функций выполняет действия cocos2d или модифицирует узлы в фоновом потоке, будут проблемы. Вместо этого используйте встроенный график cocos2dSelector: interval: methods.

Конкретная проблема здесь - цикл while. Вы вызываете runUntilDate, который блокирует основной поток в течение 5 секунд, и вы делаете это до 4 раз. Это означает, что cocos2d и ui получают обновление и выводят свое состояние каждые 20 секунд. Неудивительно, что приложение зависает.

Если вы хотите выполнить многопоточность, используйте функцию performSelectorInBackground или grand central dispatch. Запуск циклов и потоков слишком низкий, если вы не контролируете весь цикл запуска приложения и все потоки.

+0

Если я использую cocos2d встроенный 'scheduleSelector: interval:', то он не будет работать должным образом, поскольку действия будут перекрываться, а графики будут перенесены с 0.000 на 0.000. Потому что в то время как цикл будет работать в микросекундах. Итак, мне нужна такая техника, по которой цикл запускается через некоторое время или после завершения предыдущих действий. Какие-либо предложения??? – eagle

+0

переосмыслить то, что вы пытаетесь сделать ... вы, вероятно, хотите использовать CCSequence и/или действия CCCallBlock для создания и запуска следующей последовательности – LearnCocos2D

+0

Я использовал действия CCSequence и CCCallBlock там, где это необходимо. но в каждой функции1-6 в некоторых разных условиях выполняется соответствующее действие в зависимости от результатов, полученных из предыдущей функции. Таким образом, он не может выполнять его в одиночной функции, используя действия CCSequence и CCCallBlock. – eagle

 Смежные вопросы

  • Нет связанных вопросов^_^