나는 프로그래밍 게임에 iPhone. 나는 현재 사용하여 NSTimer 트 내 게임 업데이트/렌더링합니다. 이 문제는(후 프로파일링)내가 나타나를 잃은 많은 시간이 업데이트/렌더링하고 이것을 시간 간격을 나는 플러그인으로 NSTimer.
그래서 제 질문은 무엇이 최선의 대안을 사용하여 NSTimer?
하나의 대안별로 응답하십시오.
당신이 얻을 수 있는 더 나은 성능으로 스레드,try something like this:
- (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
방법을 준비하는 프레임 버퍼,그리 프레임과 프레임버퍼에서는 화면입니다. (P.S. 가article에서 다양한 종류의 게임 루프 및 그들의 장단점이 있습니다.)
I don't know 아이폰에 대해서는 특히,그러나 나는 아직도 도움을 줄 수 있: 대신 간단하게 연결하는 고정 지연의 끝에서,루프를 사용하여 다음과 같다:
결정하는 새로 고침을 간격은 당신이 행복할 것이고 보다 큰 단일 통과의 기본다. 에서 루프의 시작을 현재의 타임 스탬프 무엇이든 해결을 사용할 수 있고 저장합니다. 의 끝에서,루프 또 다른 타임 스탬프,결정 시간이 경과한 후에 타임스탬프(초기화 전에 이 반복). 잠/지연의 차이에 대한 당신의 이상적인 프레임 타임과 이미 경과한 시간 이에 대해 프레임입니다. *에서 다음 프레임,당신은 당신을 시도 할 수 있습을 보상하기 위해서 정확하지 간격을 비교하여 타임스탬프를 시작에서는 이전의 반복입니다. 저장소의 차이를 추가하기/빼기에서 그것은 간격의 끝에서 이 루프(잠/지연을 갈 수 있습 너무 길거나 짧은).
당신이해야 할 수 있습니다 경고 메커니즘이 있는 경우 알 수 있습니다'다시 타이밍이 너무 꽉(i,전자하는 경우,잠시 후 모든 보상은 0 보다 작은 것을 의미를'다시 복용을 처리하는 데 시간이 더 이상 당신의 프레임 속도)를 보낼 수 있습니다. 은 효과가 있을 것입니다 당신의 게임 속도가 느려집니다. 추가,점을 단순화할 수 있습에 렌더링하는 동안,당신이 감지하는 경우 이런 일이 있을 때까지 충분한 여유 용량을 다시합니다.