버그 해결을 위한 모든 질문을 던져
0 votes
139 views
일단 현 상황을 이야기 하자면 WinAPI 개인 포트폴리오로 스타크래프트를 모작하려고 합니다.

단순 기능구현에서 끝내는게 아닌, 락스텝을 이용한 멀티플레이까지 개발하는것이 목표입니다.

지금까지 서버를 만져본 경험은 포톤클라우드를 잠깐 만져본것과 Node.js로 턴제 멀티게임을 구현해본게 다여서 아직 부족한게 많아 서적을 구매해서 읽거나 구글링으로 자료를 찾아서 읽어보며 꾸준히 공부중입니다.

지금 포트폴리오에 넣을 서버는 Boost.Asio를 사용해서 개발할 계획입니다 (이게 그나마 게임쪽에서 종종 쓰인다고 하더군요)

여기서 질문이 있습니다.

락스텝을 구현하려면 고정소수점으로 게임루프를 개발해서 플레이와 관련된 모든 연산중 부동소수점을 고정소수점으로 대체 해야한다고 알고있습니다.

여기서 가장 어려움을 겪고 있는것이, 프레임과 프레임 사이의 델타타임을 어떻게 고정소수점으로 받느냐입니다.

제가 지금까지 델타타임을 구할때는 QueryPerformanceFrequency와 QueryPerformanceCounter 함수를 활용해서 델타타임을 구해오는 방식이었는데 이 델타타임을 고정소수점으로 변경하게 되어도 변경하는 과정에서 값이 잘리게 되면 그 잘린 값으로 인한 오차가 누적되어서 동기화가 풀릴것같다는 생각을 하게 되었습니다.

고정 소수점의 표현범위도 한계가 있어서 설령 동기화가 된다고 해도 유닛이 일정범위 이상으로 움직이면 오버플로우로 에러가 발생할것 같구요( 이 부분은 크기를 키우면 해결될것도 같습니다)
서버 관련 된 책을 사서 읽어도보고 자료를 찾아봐도 찜찜함을 떨칠 수가 없더라구요

요약하자면,
Q1. 델타타임을 고정소수점으로 표현하여서 사용하면 잘린값에 의한 오차로 동기화가 풀리지 않나요?
풀리지 않는다면 왜 그렇죠?
Q2. 중간에 보정작업을 하지 않고 순수하게 입력만으로 동기화가 가능한가요?

이정도 지식이 없으면 때려쳐라! 라는 식의 조언도 감사히 받겠습니다
asked (3 point) , 139 views
https://www.youtube.com/watch?v=NXwUiC2gxmo 춤 질문인줄 알았는데 아쉽네요

1 답변

+2 votes
보통은 프레임과 프레임 사이의 델타타임은 1/1000초 밀리 세컨드를 사용합니다.

락스텝이 근데 델타타임을 사용하던가요?

락스텝은 턴제RPG 를 만드는것과 동일 합니다. 상대 페이즈 내페이즈가 동일하게 제출 했을때 다음 턴으로 넘어갑니다. 그러므로 프레임과 프레임 사이를 측정해서 델타 타임을 제출 하는게 아니라 고정된 프레임을 제출 하여 서로 제출 되었을때 다음 턴으로 넘어갑니다. 락스텝 가지고 실시간 게임을 만든것중에 가장 유명한건 스타크래프트 1 입니다. Drop을 걸수 있는 이유가 상대가 턴을 제출 하지않기 때문에 넘어가 지지 않는겁니다.
answered (184 point)
제가 정말 기초도 모르고 이상한 질문을 했었군요...

저는 게임 루프니까 당연히 델타타임을 쓸거라고 생각했는데.. 모자란 제가 부끄러워 지는 순간입니다 ㅠ

답변 정말 감사합니다! 덕분에 속이 시원해졌어요!

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

544 질문
703 answers
684 댓글
118,235 users