2012-05-18 6 views
0

저는 음악 앱을 제작 중이므로 어떤 latancy도 승인 할 수 없습니다.감동에 잘 응답합니다.

나는 터치를 처리하기 위해 사랑하는 touchesBegan/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에서 정확한 역을한다.

내 시도에서 더 잘 작동하도록 GLKit에 GCD를 사용 했으므로 비동기 적으로 발생합니다. 시간이 흐르면서 작동하는 것을 보았습니다. touchesEnded가 그것을 제거하려고 시도했을 때 배열에서 t.

누군가가 도와 주면 감사 할 것입니다.

답변

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

대안은 터치에 따라 큐를하는 것입니다. touchesBegan에 디스패치 큐를 만들고 태스크를 버리십시오. 당신은 그들 모두를 끝내게 할 수 있습니다, 아니면 아마 그들 중 일부는 그냥 터치로 취소해야합니다. 끝.

예를 들어 상태가 이미 다른 것으로 변경된 경우 나머지 터치를 처리하는 것은 감지되지 않을 수 있습니다.

나는 이와 같이 라인 스무딩을 수행했다.

어느 쪽이든 집중적으로 처리하는 경우 시스템에서 처리 방법을 찾아야합니다. 적절한 경우 수행중인 작업을 종료 할 수 있는지 확인하십시오.

상태를 완료로 표시하고 끝나면 아무 것도 처리하지 말아야합니다. 끝 ... 결국 포인터는 사전의 키로만 사용됩니다 ...