2010-07-10 3 views
4

iPhone 용 OpenGL ES에서 2D 게임을 만드는 중입니다. (권장 함수 내에서 다시 나는 NSTimer를 실행 해요) 나는 'NO'로 설정 반복과 0.002 (60 FPS)의 간격으로 NSTimer를 사용하여 내 게임 루프를 호출하고 있습니다 :새로운 iPhone과 오래된 iPhone에서 일정 속도를 유지하려면 어떻게해야합니까?


-(void)gameLoop:(id)sender { 
    double currTime=(double)CACurrentMediaTime(); 
    m_FPS_framesThisSecond++; 
    float timeThisSecond=currTime-m_FPS_lastSecondStart; 
    if (timeThisSecond>1.0f) { 
     m_FPS=m_FPS_framesThisSecond; 
     m_FPS_framesThisSecond=0; 
     m_FPS_lastSecondStart=currTime; 
    } 

    [game update]; 
    [game render]; 

     //Continue the loop 
    [NSTimer scheduledTimerWithTimeInterval:0.002 target:self selector:@selector(gameLoop:) userInfo:nil repeats:NO]; 
} 

이 실행됩니다 부드럽게 내 3GS에서,하지만 2G에서 이것을 테스트하면 게임이 훨씬 느리게 실행되고 때때로 가끔씩 빈 프레임이 생깁니다. 간격을 0.033 (30fps)로 낮 춥니 다. 그것은 3G에서 너무 느립니다.

두 장치 모두에서 일관된 재생을 얻으려면 어떤 방법이 있어야한다는 것을 알고 있습니다. 낙서 점프는 두 휴대 전화에서 원활하게 동일한 프레임 속도로 실행되는 것으로 보입니다.

+0

글쎄, 하드웨어 아키텍처를 언제 떠날 지에 대한 더러운 생각이 있습니다.애플은 iOS4에서 아이폰 2G (오리지널 아이폰)에 대한 공식 지원을 중단했다. 어쩌면, 미래의 OpenGL ES 업데이트가 3G 이상을 대상으로하기 때문에 (심지어 3G가 ES2를 지원하지 않더라도 Apple이 OpenGL ES2 장치 지원 시스템을 현재 출하하고있는 방식을 보는 것으로 볼 수 있기 때문에) . 당신에게 나쁜 질문이 있다는 것을 말하지 않고 (사실, 나는 그것을 +1했다) 단지 가끔은 앱의 미래도 고려해야한다고 말하고있다. – Jann

+0

전 3GS 장치를 무시하고 싶습니다. (2G는 더 이상 알지 못합니다). 그러나 동시에, 나는 게임 속도와 프레임 속도를 분리해야한다고 생각합니다. 어쨌든, OpenGL ES2가 내 다음 노력이 될 것입니다! – Scott

답변

2

근본적인 문제는 이것이다 :

게임이되지는 렌더링 횟수를하여 렌더링 마지막 시간 이후 경과 한 시간의 양을 기준으로 업데이트해야합니다. 어떤 속도를 기반으로 스프라이트의 위치를 ​​계산한다고 가정합니다. 새 위치는 렌더링 사이의 시간을 기반으로 계산되어야하며, 마지막 렌더링 이후 0.002 초가 경과 한 것으로 가정하지 말아야합니다. 이를 FPS 독립 애니메이션이라고합니다.

그래서, 여기에 간단한 예입니다 :

// FPS dependent animation 
int x = sprite.x + sprite.velocity.x 

마지막 렌더링 이후의 시간을 사용하고, 비례 적으로 업데이트하는 것이 작업을 수행 할 수있는 적절한 방법. 다음 코드는 0.002가 시간축이라고 가정합니다. 렌더링이 두 배 오래 걸립니다 장치에

// FPS independent animation 
int x = sprite.x + sprite.velocity.x * time_since_last_render/0.002 

, 다음 업데이트는 지금까지 두 번 개체를 이동합니다, 그래서 빠른 장치에서와 마찬가지로 동일한 장소에서 끝납니다.

부작용이 있으므로 다음 프레임을 앞으로 0.002 초 렌더링하지 않아야합니다. 현재 프레임이 렌더링하는 데 걸린 시간을 확인하고 0.002에서 해당 프레임을 뺀 다음 렌더링을 사용하여 다음 렌더링을 예약하십시오. 당연히이 숫자는 0의 최소값을 가지므로 느린 장치에서는 과거로 시작하지 않습니다. 예를 들어, 렌더링 기능이 렌더링하는 데 정확히 0.002 초가 걸리면 불필요하게 프레임 속도가 절반 낮아집니다.

+0

감사! 현재 시간에서 이전 프레임의 시간을 뺀 값을 단순히 구함으로써 time_since_last_render를 계산할 수 있습니까? – Scott

2

프레임 속도의 두 가지 사실이 있습니다

  • 디스플레이 프레임 속도 : 화면이 다시 그려되는 속도는
  • 논리 프레임 속도 : 게임 로직이 업데이트되는 속도 (게임 속도)

난 당신이 휴대 전화 하드웨어의 모자에 맞게 조정 디스플레이 프레임 속도에서 분리됩니다 상수 논리적 프레임 속도를 찾고 있다고 생각 능력. 각 논리 프레임에 대해 하나의 디스플레이 프레임을 완료해야하는 게임 루프와 비교하십시오.

deWiTTERS Game Loop에 설명 된 "최대 FPS로 일정한 게임 속도"알고리즘을 확인하십시오. 게임 로직이 3G 및 2GS에서 동일한 속도로 실행되지만 디스플레이 프레임 속도는 더 느린 2G CPU로 조정됩니다. 위 기사에서 다루지 않았지만 디스플레이 프레임 속도를 제한하여 배터리를 절약 할 수도 있습니다.