• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

서버-클라 게임로직 처리에 관해 질문 드립니다

22.03.18 20:43 작성 조회수 659

0

안녕하세요, 항상 양질의 강의 감사히 듣고 있는 대학생입니다!
본 강의와 다른 자료들과 병행하면서 학습하다 한가지 궁금한게 생겨서 질문 드립니다
본 강의에선 자세히 언급되지 않는 내용이긴 하지만 달리 여쭤볼 분이 없어서 정말 죄송한 마음 가지고 질문드립니다 ㅠㅠ

패킷 전송 지연 시간 때문에 클라이언트에서 서버틱보다 더 나중의 틱을 미리 연산해 화면에 띄우고 있다가, 서버에서 연산한 결과와 다르면 클라이언트에서 앞선 결과들을 수정해 수정된 결과를 다시 띄우는 형태로 돌아가는 게임들이 있다고 알고 있습니다. 또 이럴 경우엔 게임로직 연산을 클라랑 서버 양쪽 모두에서 실행해야 하는 걸로 이해하고 있습니다.

그렇다면 동일한 게임 로직 코드가 클라쪽과 서버쪽 모두에서 실행되게 될텐데 이걸 현업에선 어떤 식으로 처리하는지 궁금합니다!

클라랑 서버측 프로그램에 똑같은 게임로직 코드를 복붙하는 방식으로는 유지보수가 어려울테니 절대 그렇게 할 것 같진 않은데, 그러면 게임 로직 전체를  하나의 함수로 만들어서 서버와 클라 각각 해당 함수를 가져오는 방식으로 처리하나요? 아니라면 어떤 식으로 처리하는지 궁금합니다!

답변 1

답변을 작성해보세요.

1

패킷 전송 지연 시간 때문에 클라이언트에서 서버틱보다 더 나중의 틱을 미리 연산해 화면에 띄우고 있다가, 서버에서 연산한 결과와 다르면 클라이언트에서 앞선 결과들을 수정해 수정된 결과를 다시 띄우는 형태로 돌아가는 게임들이 있다고 알고 있습니다. 또 이럴 경우엔 게임로직 연산을 클라랑 서버 양쪽 모두에서 실행해야 하는 걸로 이해하고 있습니다.

물론입니다. 대표적인 예로 FPS 게임들이 그렇습니다.
서버에서 연산된 계산을 기다렸다 적용하기엔,
기다리시는 시간이 너무 길어서 키보드 반응이 너무 늦습니다.
따라서 일단 클라에서 혼자 '지르고' 본 다음에,
서버에서 연산 결과를 보고 너무 차이가 많이 나면 위치를 보정합니다.
(배그에서 가위눌리는 현상 같이 일어남)

그렇다면 동일한 게임 로직 코드가 클라쪽과 서버쪽 모두에서 실행되게 될텐데 이걸 현업에선 어떤 식으로 처리하는지 궁금합니다! 클라랑 서버측 프로그램에 똑같은 게임로직 코드를 복붙하는 방식으로는 유지보수가 어려울테니 절대 그렇게 할 것 같진 않은데, 그러면 게임 로직 전체를  하나의 함수로 만들어서 서버와 클라 각각 해당 함수를 가져오는 방식으로 처리하나요?

클라와 서버가 둘다 동일한 언어로 만들어졌다는 보장도 없을뿐더러,
대부분의 경우에는 연산하는 주기가 다릅니다.
클라는 60프레임 이상으로 아주 빈번하게 계산하면서 미세하게 좌표를 이동시킬 수 있지만,
서버의 경우 MMO 기준으로 0.2초에 한 번 정도 좌표 계산을 하는게 일반적입니다.
따라서 완전히 동일한 코드를 사용하진 않고
공식을 통일시킨 다음에 양쪽에서 각자 작업하는게 일반적입니다.
다만 길찾기 알고리즘은 항상 일치를 시켜놓습니다.
클라와 서버의 게임 세상엔 필연적으로 어느 정도 오차가 있는데
이를 어디까지 허용할지도 어려운 문제입니다.
너무 엄격하게 잡아버리면, 오탐률이 발생하고
너무 너그럽게 잡아버리면, 게임 핵에 취약하기 때문이죠.

John Doe님의 프로필

John Doe

질문자

2022.03.18

답변 감사합니다! 연산하는 주기가 다를 수 있다는 건 생각을 못했네요... 구현을 각자 하다보면 사소한 차이도 치명적일 수 있을 것 같은데 그만큼 규격화나 부서간 소통이 중요할 것 같아요