2012-05-18 4 views
0

Я работаю над музыкальным приложением, поэтому я не могу одобрить какое-либо латентность.Хорошо реагирует на касания

Я использую любимые прикосновенияBegan/Moved/Ended для обработки моих касаний. Все идет хорошо, и мне удалось синтезировать тон (используя AudioUnit) и показать свечение под пальцем (используя GLKit), и все это прекрасно работает, если есть менее 4-7 заметок/касаний, попадающих в то же самое время, затем он гаснет и заставляет приложение застревать.

Я понял, что это потому, что я много работаю (с интерфейсом GLKit и интерфейсом, который я сделал для моего синтезатора), и мне нужен способ его исправить.

Мой код строится вокруг так:



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    for(UITouch *touch in touches) 
    { 
     CGPoint lePoint = [touch locationInView:self.view]; 


     doing some calculataions for synth engine....... 
     actually making the sound avilable to play through the interface........ 

     then I start to create the sprite object for the glow 
     attaching it to the nsarray of the shapes 
     //rejoycing in the awesomness of the sound 


     adding the touch to the active touches array 


    } 

} 

я точный обратный в touchesEnded.

Так что, пытаясь улучшить работу, я попытался использовать GCD для материала GLKit, так что это произойдет асинхронно, Это сработало, но порой мне приходилось видеть сияние, остающееся на экране, потому что это было не так, t в массиве, когда touchEnnd попытался удалить его.

Так что это не сработало, и я вроде как невежественный, если кто-нибудь может помочь, я был бы благодарен.

ответ

0

Используйте GCD, но убедитесь, что вы используете параллельную очередь, чтобы одновременно отправлять все касания. Если вам нужно дождаться их завершения, используйте dispatch_apply, иначе просто отключите их асинхронно.

Вы не можете отменить блокировку, как только она запланирована, поэтому вы можете поместить чек, чтобы проверить, закончилось или отменено касание, и немедленно верните блок.

Например, что-то вроде ...

for (UITouch *touch in touches) { 
    NSValue *key = [NSValue valueWithPointer:(__bridge void*)touch]; 
    MyData *data = [dictionary objectForKey:key]; 
    // set whatever attributes you want in the data for this touch 
    // You may want to have a cancel flag in there, so you can set it later... 
    CGPoint touchPoint = [touch locationInView:self.view]; 
    dispatch_async(someConcurrentQueue, ^{ 
     // If only one thing to do, check the flag at beginning, if it is a long task 
     // may want to check it periodically so you cancel as soon as possible. 
     if (data.touchHasEnded) return; 
    }); 

Альтернативы иметь очередь за прикосновение. Вы создаете очередь отправки в touchhesBegan и просто бросаете на нее задачи. Вы можете позволить им закончить, или, возможно, некоторые из них должны быть просто отменены в прикосновениях.

Например, если состояние уже изменилось на что-то еще, может быть нет смысла обрабатывать оставшиеся касания между ними.

Я сделал сглаживание линии, как это.

В любом случае, если вы выполняете интенсивную обработку, вы должны позволить системе понять, как ее управлять. Просто убедитесь, что вы можете прекратить то, что вы делаете, если это необходимо.

Убедитесь, что вы пометили состояние как выполненное и не обработали что-либо еще после касанияEnd ... В конце концов, вы используете только указатель в качестве ключа к словарю ...

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