2011-02-13 3 views
10

나는 코코아에서 게임 루프를 만드는 것에 대해 인터넷에서 멀리 떨어져있는 것처럼 보였다. 내가 본 게임 루프의 대부분은 NSTimer를 사용하여 매 초 60 분마다 이벤트를 트리거합니다. 그랜드 센트럴 디스패치 (Grand Central Dispatch)를 사용하는 예제가없는 이유는 무엇입니까? 아래의 애플 개발자 문서의 소스 코드와 같습니다. 내가 모르는 문제가 있습니까?코코아 게임이 그랜드 센트럴 디스패치를 ​​피하여 타이머를 만드는 이유는 무엇입니까?

dispatch_source_t CreateDispatchTimer(uint64_t interval, 
       uint64_t leeway, 
       dispatch_queue_t queue, 
       dispatch_block_t block) 
{ 
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 
                0, 0, queue); 
    if (timer) 
    { 
     dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway); 
     dispatch_source_set_event_handler(timer, block); 
     dispatch_resume(timer); 
    } 
    return timer; 
} 
+14

NSTimer가 GCD보다 더 유명하고 GCD가 MacOS10.6.x/iOS4.x 이상인 경우 일 수도 있기 때문에 어쩌면? – nacho4d

+0

예. 답장을 보내 주셔서 감사합니다. 이전 버전과 호환되지 않기 때문일 수 있습니다. – Tobias

답변

2

이것이 내가 대답이라고 생각합니다. nacho4d가 대답을 게시하여 그린으로 만들 수 있었으면 좋겠지 만,이 기회를 통해자가 학습자 인 Skinner Box 보상을 얻고 싶습니다.

NSTimer가 더 유명한 GCD 이상과 GCD는 MacOS10.6.x/iOS4.x 및 만 이상 때문에 덜 무섭다 어쩌면 때문에? - nacho4d 2 월 13 일 8시 1 분

12

이 질문에 대한 답변은 아니지만 일반 타이머가 완벽한 게임 루프 솔루션은 아닙니다 (가장 쉬운 방법 일 수도 있지만). 더 나은 아이디어를 줄 수있는 게임 루프에 대해서는 a very good article about game loop programming이고 두 개는 previousquestions입니다.

주요 포인트는 반복 사이에 경과 시간에 따라 루프에서 별도의 스레드에서 게임 루프를 실행하고 게임 모델을 다시 계산된다

- (void) gameLoop 
{ 
    while (running) { 
     CFAbsoluteTime now = CFAbsoluteTimeGetCurrent(); 
     CFTimeInterval deltaTime = now - lastTime; 
     [self updateModelWithDelta:deltaTime]; 
     [self renderFrame]; 
     lastTime = now; 
    } 
} 

이 당신에게 최대의 부드러움을 줄 것이다. 자세한 정보는 링크 된 소스를 읽고 멋진 스레드 게임 루프를 작성하는 것은 어렵지 않고 큰 차이를 만듭니다. IMHO.

관련 문제