2013-06-19 1 views
1

J'ai un problème plus étrange et je ne sais pas pourquoi cela se produit. Je cours une boîte à rythme qui est capable de jouer pendant que l'application est en arrière-plan.La latence d'exécution de la méthode lorsque l'écran de l'iPhone est éteint

Voici mon implémentation minuterie précise:

- (void)run 
{ 
    uint64_t interval = [self computeInterval]; 
    mach_timebase_info_data_t info; 
    mach_timebase_info(&info); 

    uint64_t currentTime = mach_absolute_time(); 

    currentTime *= info.numer; 
    currentTime /= info.denom; 

    uint64_t nextTime = currentTime; 

    dispatch_queue_t mainQueue = dispatch_get_main_queue(); 

    while (_running) { 
     if (currentTime >= nextTime) { 

      dispatch_async(mainQueue, ^{ 

       [_delegate accurateTimerDidTick:self]; 

      }); 

      interval = [self computeInterval]; 
      nextTime += interval; 
     } 

     currentTime = mach_absolute_time(); 
     currentTime *= info.numer; 
     currentTime /= info.denom; 
    } 
} 

Je commence avec

- (void)start 
{ 
    self.running = YES; 

    [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; 
} 

Lorsque l'application passe en arrière-plan, il fonctionne parfaitement, ou tout au moins la même chose que lorsque l'application est en l'état actif. Cela fonctionne bien même lorsque l'écran est verrouillé, mais lorsque l'écran s'éteint, il commence à s'étouffer ou à ralentir. Ainsi, la seule différence de performance est visible lorsque l'écran est éteint ou allumé, quel que soit l'état d'application.

Toute idée de pourquoi cela se produit serait appréciée!

Merci beaucoup d'avance.

MISE À JOUR 1: chose incroyable: j'ai commencé à vérifier l'intégration avec l'application Audiobus et le premier test qu'ils recommandent est d'exécuter l'application en Audiobus fonctionne également pour voir s'il y a des problèmes ou la latence dans le son. Devinez quoi - cela fonctionne parfaitement maintenant! Il n'y a plus de différence avec l'écran on/off. Je ne suis pas sûr que ce soit bon ou pas, parce que maintenant je suis confus encore plus. Bien sûr, le même problème revient lorsque l'application Audiobus ne fonctionne pas.

Répondre

0

Vous avez effectivement fait une boucle infinie qui va manger une tonne de CPU. iOS a toutes sortes de mécanismes pour maximiser la durée de vie de la batterie qui sont probablement activés lorsque l'écran s'éteint. Vous aurez besoin d'améliorer votre minuterie afin qu'elle ne tourne pas efficacement à 100% CPU sur 1 thread. Ajoutez des appels de veille de petite durée pour que le processeur puisse ralentir.

+0

Merci beaucoup pour votre réponse rapide! J'ai essayé de mettre différentes méthodes de sommeil dans la boucle while, mais aucune n'a fait l'affaire. Peut-être que je fais quelque chose de mal ou que je vous ai mal compris. Pouvez-vous me pousser un peu dans la bonne direction? Quelle méthode de sommeil utiliseriez-vous, combien de temps devrait-elle dormir? Il est important de mentionner que j'ai besoin d'un battement de tambour toutes les 50 millisecondes maximum. – imilakovic

Questions connexes