문제

나는 iPhone에서 게임을 만들기 위해 Opengl es를 사용하고 있습니다. 불행히도, 나는 작은 (그리고 불규칙한) 딸꾹질을 본다.

나는 수면이있는 타이머를 사용하여 1 초마다 드로우 함수를 호출하여 단단한 프레임 속도를 달성하기 위해 드로우 기능을 호출합니다. 타이머가 잠에서 깨어 난 순간을 바꾸려고 노력하여 드로우 기능을 실행하는 데 더 많은 시간을 제공했습니다. 딸꾹질은 더 많은 시간이 주어지면 딸꾹질이 줄어 듭니다. 8 밀리 초로 애니메이션은 거의 유동적입니다. 내 발견은 다음과 같습니다.

  1. 분명히 GPU에 실제 도면을 실행할 시간을 더 많이 주면 (거의) 완벽한 유체 애니메이션이 발생합니다.
  2. 내 프레임의 정확한 끝에 그림을 그리면 말더듬, 딸꾹질 및 그렇지 않은 것입니다.

이제 나는 그것을 알고 있으므로 어떻게 진행 해야할지 잘 모르겠습니다. 이 행동의 원인에 대한 두 가지 모순 된 아이디어가 있습니다.

  1. 첫째, OpenGL 명령이 이전 프레임의 도면을 방해 할 수 있습니까? 내가 이해하는 한 명령이 저장되기 때문에 이것이 사실이 될 수 없으며 Draw 명령이 주어질 때만 실행됩니다.
  2. 둘째, 드로우 명령의 변동 시간으로 인해 타이머가 진드기를 건너 뛸 수 있습니까?

그렇다면 어떤 설명이 더 가능성이 있습니까? 아니면 아니야? 물론 드로우 함수를 별도의 실에 넣고 내 문제가 해결되는지 확인할 수있었습니다. 그러나 나는 OpenGL을 더 이해하고 싶습니다.

이것은 부름을받는 기능이며 내가 취하는 것을 설명합니다.

- (void) drawView
{
    // measure time with mach_absolute_time

    // gameEngine update    
    // OpenGL commands (translate, rotate, drawArrays etc.) 

    // end measure time with mach_absolute_time
    // usleep(animationInterval - duration  - constant) 
    // constant is the time to start executing

    // draw
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];    
}
도움이 되었습니까?

해결책

이것을 읽고 싶을 수도 있습니다 게임 루프에 관한 기사, 많은 것을 설명합니다. 일반적으로 가장 좋은 솔루션은 별도의 스레드 내부의 무한 루프에서 드로우 루틴을 호출하는 것입니다 ( 이 질문) 및 마지막 업데이트 이후 얼마나 많은 시간이 지남에 따라 기본 게임 모델을 업데이트하십시오. 이것은 당신에게 부드러운 움직임을 줄 것입니다.

편집 : "히컵"의 출처는 아마도 OpenGL과 관련이 없을 것입니다. 60fps에서 우리는 프레임 당 1/60 초 ≈ 17ms에 대해 이야기하고 있습니다. 장치에 다른 프로세스가 실행되기 때문에 놓칠 수있는 타이트한 일정입니다. Safari 또는 Mail.App은 백그라운드에서 일어나기 때문에 장치는 잠시 생각하며 이제 프레임이 30ms 이상이 걸립니다. 모델이 완벽하게 꾸준한 프레임 속도를 기대하는 경우 이는 매우 쉽습니다. 해결책은 위에서 작성한 것처럼 실시간 경과에 따라 모델을 업데이트하는 것입니다. 연결된 기사는 이것을 모두 철저히 설명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top