• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

게임 실행 중 계속 프레임이 달라지는 문제점

21.08.08 01:45 작성 조회수 184

0

안녕하세요, 코드 작성중에 궁금한 점이 있어 질문드립니다.

예제 코드를 계속 컴파일하다가 이상한 점을 발견했는데요, 게임의 fps가 계속 달라진다는 것입니다.

어쩔때에는 물체가 부드럽게 이동하고, 어쩔때에는 물체가 뚝뚝 끊겨서 이동하는 느낌을 받습니다.

원인이 무엇일까 생각해보다가, Game2D 클래스의 run() 메소드에 관련 코드가 있는 것을 확인했습니다.

위 if문으로 인해서 시스템이 계속 sleep을 하니까 프레임이 끊기는 것처럼 보이더라구요. 

또한 dt 값을 계속 확인해보니  값이 불규칙한 것을 확인했습니다.  dt 값이 불규칙적이니,  sleep도 일정하지 않게 작용하면서 화면 프레임이 계속 달라지는 현상이 생기는 것으로 예상됩니다. (dt 값이 왜 불규칙한지는 모르겠습니다.)

찾아보다가 glfw 메소드 중에 glfwSwapInterval 이라는 메소드가 있어서 사용해봤는데, 인자로 1을 넣어주면 fps가 자동으로 144에 맞춰지더라구요. 또한 일정한 fps 값을 유지시켜주니, 컴파일 할때마다 게임화면의 fps가 달라지는 문제점도 해결된 것 같습니다.

그렇다면 timer class 를 사용하지 않고, 어차피 timer는 프레임 제한을 위한 도구이니 앞서 이야기한 glfwSwapInterval 메소드를 사용해도 괜찮을까요? 

위는 timer class를 사용했을 때 FPS를 계산한 것이고, (worst case인 경우 위처럼 프레임이 변합니다.)

위는 glfwSwapInterval 메소드를 사용했을 때 FPS입니다.

답변 1

답변을 작성해보세요.

1

좋은 발견을 하셨네요! glfwSwapInterval  사용 하셔도 됩니다.

감이 좋으셔서 더 깊은 내용이 궁금하신 것 같은데 최신 랜더링 파이프라인에서는 멀티쓰레딩으로 GPU 파이프라인과 CPU 파이프라인의 싱크를 맞춰주면서 프레임레이트를 최적화합니다. 본 강의에서 2D 게임 하나 만들면서 객체지향 프로그래밍에 대한 감을 잡으신 후에 Modern OpenGL, Vulkan 순으로 공부해나가시면 됩니다. 물론 중간에 DirectX11, 12, Metal 등도 함께 공부하시면 좋겠죠. (본 강의는 그래픽스 부분을 최소화하기 위해서 고전 OpenGL을 사용했었습니다.)

지금은 너무 빨라서 느리게 하면서 프레임 레이트를 균일하게 맞춰주고 있지만, 나중에는 어떻게든 더 빠르게 만들려고 노력하시게 될겁니다.