2013-06-19 2 views
1

나는 이상한 문제가 있으며 왜 이런 일이 일어나는지 전혀 모른다. 앱이 백그라운드에서 재생할 수있는 드럼 머신을 실행 중입니다. 응용 프로그램이 백그라운드로 전환 될 때 앱이있을 때와 같은 완벽하게 작동, 또는 적어도, 내가iPhone 화면이 꺼져있는 동안 메서드 실행 대기 시간이

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

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

로 시작

- (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; 
    } 
} 

:

은 여기 내 정확한 타이머 구현입니다 활성 상태. 화면이 잠겨 있어도 제대로 작동하지만 화면이 꺼지면 화면이 멈추거나 속도가 느려집니다. 따라서 응용 프로그램의 상태에 관계없이 화면이 꺼져 있거나 켜져있을 때 성능의 유일한 차이점이 눈에 띄게 나타납니다.

왜 이런 일이 발생하는지 알고 싶습니다.

대단히 감사합니다.

UPDATE 1 : 믿을 수없는 일이 : 나는 Audiobus 응용 프로그램과 그들이 추천하는 첫 번째 테스트와의 통합을 확인하는 시작은 Audiobus는 소리에 어떤 결함이나 대기 시간을가 있는지를 실행하는 동안 응용 프로그램을 실행하는 것입니다. 맞춰봐 - 이제 완벽하게 작동합니다! 더 이상 화면 켜기/끄기와 아무런 차이가 없습니다. 그것이 실제로 좋은 것인지 확실하지 않습니다. 왜냐하면 지금은 더 혼란 스럽기 때문입니다. 물론 Audiobus 앱이 실행되고 있지 않을 때도 같은 문제가 발생합니다.

답변

0

효과적으로 CPU를 먹을 수있는 무한 루프를 만들었습니다. iOS에는 화면의 전원이 꺼지면 활성화되는 배터리 수명을 극대화하기위한 모든 종류의 메커니즘이 있습니다. 1 스레드에서 100 % CPU에서 효과적으로 회전하지 않도록 타이머를 개선해야합니다. CPU가 스로틀 (throttle)을 할 수 있도록 약간의 슬립 호출을 추가하십시오.

+0

빠른 응답을 보내 주셔서 감사합니다. 나는 while 루프 안에 다른 수면 메소드를 넣으려고했지만 아무도 트릭을 만들지 못했습니다. 어쩌면 내가 뭔가 잘못하고 있거나 너를 오해 한 것일 수도있어. 제게 올바른 방향으로 조금 밀어 주시겠습니까? 어떤 수면 방법을 사용하겠습니까? 얼마나 오래 자야합니까? 50 밀리 초마다 드럼 비트가 필요하다는 점은 중요합니다. – imilakovic

관련 문제