Post List

[서버개발캠프 4기] 15일차 기록, 개발기 #2

[스마일게이트 서버개발캠프 4기] 15일차 기록, 개발기 #2

- 밥



오늘 점심은 믹스돈가스였습니다.
조금 딱딱하긴 했지만 그럭저럭 맛있게 먹었습니다.
오늘은 안과 진료로 4시 칼퇴해서 저녁은 못먹었습니다. 아마 김치돼지찜이 나왔을텐데 너무 아쉽습니다.

- 일정

9시 30분 팀원들과 Weekly Sprint 진행했습니다. 이번주차 무슨일 할건지, 해야하는지 정하는 시간이었습니다. 그 후 캠프장님과의 게임 아키텍처 멘토링이 진행되었고, 캠프장님께서 채팅서버를 따로 두고 서버 Scale-Out을 고려한 서버아키텍처 구현과 더불어 잘 만들어보라는 조언을 해주셨습니다. 

- 개발기 #2

개발기 #1은 여기 기록해 두었습니다.
#1에서는 TCP로 채팅구현과 캐릭터 이동을 기록했었습니다.

지난 토요일 하루종일 1. 단말간 정확한 계산을 위한 키 동기화 2. 손실에 대비한 UDP 중복송신, 3. 정보가 모일때까지 입력지연 을 직접 구현해 보았는데, 결국 실패했습니다.
투자한 시간 대비 효율이 매우 안좋다고 생각하던 중, 프로그래밍 격언이 떠올랐습니다.

바퀴를 다시 발명하지 마라.

이미 우리 팀은 좋은 서적과 소스코드를 보유하고 있었는데, 직접 처음부터 구현하려고 했습니다. 격언대로, 우리는 우리 게임 사양에 맞게 취할것은 취하고 뺄 것은 빼는, 즉 튜닝하기로 하였습니다.

이번주차 계획은 "클라이언트에 바로 적용 가능한 네트워크 라이브러리 제작" 입니다.
우선 캐릭터가 프레임에 맞게 이동해야 하므로 위의 3가지, 입력지연, UDP중복송신, 키 동기화를 구현해야 했습니다. 열심히 노력한 결과, 프로토타입 제작에 성공하였습니다. 이때 적용된 기술은 송수신할 구조체 정보를 직렬화, 역직렬화 하고 네트워크 바이트 오더로 변환한 후 송신하는 기술 입니다. 그 후 테스트용으로 3D 애니메이션까지 적용해 보았습니다. 




구현하던 중, 대역폭은 어디까지 수용이 되는지 궁금해졌기에 간단한 계산을 해보았습니다.
어찌되었든 각 단말에서 실행되는 프레임을 동기화 해야 하므로 매 프레임당 보내야 하는것은 맞습니다. 캐릭터가 이동하는 게임에서 전투가 이루어지므로 캐릭터의 위치가 어긋나면 안되기 때문입니다. (목적지만 주어지면 deltaTime으로 각자 알아서 갈 것이라고 생각했는데, 이 글을 쓰는 지금 deltaTime이 다르다면 도착 시간만 갖고 이동 과정의 캐릭터 위치는 다를것이라는 생각이 들었습니다.) 이것이 키 동기화의 메인 테마였고, 그렇다면 1초에 60프레임이라고 가정했을 때 얼마나 많은 바이트가 사용될지 궁금해졌습니다. 

아직 게임 사양이 정확하게 나온것도 아니고, 실제 Header를 제외하여 대략 계산해 본다면

- 캐릭터 이동 목적지, 공격/스킬에 사용되는 구조체가 20B 이고, 1초에 5번 명령된다면
20B * 5번 * 4번(중복전송) 이므로 400B,
- 프레임을 맞추기 위한 의미없는 데이터가 1B이고 1초에 55번 명령된다면
1B * 55번 * 4번(중복전송) 이므로 220B.
1초에 620B가 각 단말에서 송신됩니다. 수신도 할 것이므로 1240B가 됩니다.
즉 1분에 74.4Kb, 예상 플레이시간 20분에 1.4Mb일 것입니다. 
(현재까지 지식으로는 이렇습니다!!!!!)

현재 기획은 이동, 파밍, 전투까지이고 추후 개발 일정에 따라 시간이 된다면 상점-아이템 기능, 보급상자, 몬스터 파밍 시스템까지 구현할 계획입니다.

개발기 #3에서는 각 송신 정보 유형별 모듈화를 구현할 예정입니다.
deltaTime에 기인한 프레임별 캐릭터 위치 동기화 문제는 내일 회의 후 어떻게 할 지 결정할 계획입니다.


댓글