2008-09-18 1 views
23

iPhone에서 게임을 프로그래밍하고 있습니다. 현재 NSTimer를 사용하여 게임 업데이트/렌더링을 실행하고 있습니다. 이 문제는 (프로파일 링 후) 업데이트/렌더 사이에 많은 시간을 낭비하는 것으로 보입니다. 이는 NSTimer에 연결하는 시간 간격과 대부분 관련이있는 것으로 보입니다.NSTimer를 사용하는 것 외에 iPhone에서 게임 루프를 만드는 더 좋은 방법은 무엇입니까?

내 질문은 NSTimer를 사용하는 가장 좋은 대안은 무엇입니까?

답변마다 한 가지 대안을 주시기 바랍니다.

+0

iPhone 개발자 예제를 보았습니까? (Touch Fighter 또는 CrashLanding 예를 들어, 조명일지도 모른다.) –

+0

나는 많은 예를보고 인터넷에서 대안을 연구했다. 그래서 나는 이미 몇 가지 대안을 알고있다. 나는 정말로 다른 사람들이 최선의 대안이라고 생각하는 것인가? 극도의 쇼 rt 프로젝트를 사용하면 조사에 저장된 모든 시간이 큰 도움이됩니다. –

답변

4

나는 특히 아이폰에 대해 잘 모르지만, 난 아직도 도움을 줄 수 있습니다

  • : 단순히 루프의 끝에 고정 지연에 연결하는 대신 를 다음과 같이 사용 만족할만한 새로 고침 간격을 결정하십시오. 이는 주 루프를 통과하는 단일 간격보다 큽니다.
  • 루프의 시작 부분에서 현재 사용 가능한 해상도의 타임 스탬프를 가져 와서 저장하십시오.
  • 루프의 끝에서 다른 타임 스탬프를 가져 와서 마지막 타임 스탬프 이후의 경과 시간을 결정합니다 (루프 전에이를 초기화하십시오).
  • 이상적인 프레임 시간과 이미 경과 된 시간의 차이 인 프레임에 대한 슬립/지연.
  • 다음 프레임에서 이전 루프의 시작 부분에서 타임 스탬프와 비교하여 수면 간격의 부정확성을 보완 할 수도 있습니다. 차이를 저장하고이 루프가 끝날 때 수면 간격에서 더하거나 뺍니다 (수면/지연이 너무 길거나 너무 짧을 수 있음).

당신은 당신이 타이밍을하는 경우 알 수 있습니다 경고 메커니즘을 할 수 있습니다 (모든 보상 후 수면 시간이 0보다 작은 경우 I, E, 당신이있어 의미있는 너무 꽉 프레임 속도보다 처리하는 데 더 많은 시간이 소요됨). 게임의 속도가 느려지 게됩니다. 여분의 점을 위해 여분의 용량이 다시 확보 될 때까지 잠시 동안 렌더링을 단순화하고이 상황을 감지 할 수 있습니다.

18

당신은 스레드와 더 나은 성능, 이런 식으로 뭔가를 시도 얻을 수 있습니다 :

- (void) gameLoop 
{ 
    while (running) 
    { 
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
     [self renderFrame]; 
     [pool release]; 
    } 
} 

- (void) startLoop 
{ 
    running = YES; 
#ifdef THREADED_ANIMATION 
    [NSThread detachNewThreadSelector:@selector(gameLoop) 
    toTarget:self withObject:nil]; 
#else 
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f/60 
    target:self selector:@selector(renderFrame) userInfo:nil repeats:YES]; 
#endif 
} 

- (void) stopLoop 
{ 
    [timer invalidate]; 
    running = NO; 
} 

renderFrame 방법에서 당신은 프레임 버퍼를 준비 프레임을 그리고 화면의 프레임 버퍼를 제시한다. (추신 : 다양한 종류의 게임 루프와 장점과 단점에 대해 이 있습니다.

+0

-1. UIView 스레드로부터 안전하지 않습니다, 그래서 당신은 다른 것들을 일을 할 수 있도록 모든 잔뜩해야합니다. UIGraphics는 4.0부터 스레드로부터 안전합니다. –

+1

@tc : 네 말이 맞지만 포스터는 자신이 사용하는 그래픽 레이어에 대해 아무 말도하지 않습니다. 우리가 게임에 관해 이야기하고 있기 때문에, 나는 그런 루프가 문제없이 작동하는 OpenGL을 사용했다. – zoul

+0

@ zoul : 이전 버전에서도 'THREADED_ANIMATION' 대안이 가능합니까? 나는 어딘가에 읽지 않는다고 생각했다. –

0

CADisplayLink를 사용하면 XCODE에서 제공되는 OpenGL ES 템플릿 프로젝트에서 어떻게 찾을 수 있습니까 (이 템플릿에서 시작하는 프로젝트 만들기 및 EAGLView 클래스를 살펴 보자.이 예제는 열린 GL을 기반으로하지만 다른 게임에 대해서만 CADisplayLink를 사용할 수있다.

관련 문제