공부한거 잊었을 때 보려고 만든 블로그

소켓통신 게임프로그래밍에 대한 고찰 본문

서버 프로그래밍

소켓통신 게임프로그래밍에 대한 고찰

Parcon 2023. 3. 22. 22:44

유니티 클라이언트와 파이썬 TCP/IP 서버를 구현하여 소켓통신으로 온라인 게임의 기반을 만들었다.

 

서버와 클라이언트는 JSON을 주고 받으며 통신하고, 약속된 type의 키가 아니라면 아무런 동작을 하지 않는다.

 

예시) 

클라이언트가 서버로 접속 요청을 하면 서버는 클라이언트와의 통신을 스레드로 처리한다.

스레드로 처리하기 때문에 이 패킷을 누가 보내는지 알고 있으므로 유저 정보는 보낼 필요가 없다.

 

{"type":"enter_room"} 을 클라이언트가 서버로 보내면 서버는 받은 JSON의 "type" 키 값을 읽는다.

"패킷을 보내는 클라이언트가 방 입장을 요청한다." 라는 정보를 받았으므로

서버의 리스트 또는 딕셔너리에 방을 생성하고 해당 유저를 추가한다.

 

자세한 구조는 코드를 정리하고 포스팅하도록하고 어떤 방식으로 동기화할 지 고민해봤다.

 

1. 서버 부하를 생각하여 키 입력이 발생 했을 때만 패킷을 전송하는 방식

2. 적당한 량의 프레임으로 좌표와 회전값을 부드러운 이동 수준으로 동기화하는 방식

 

1번 방식은 이동 연산에 필요한 값 (어떤 방향키를 눌렀는지 등)만 동기화를 한다면 패킷량이 매우 줄어들것이고

다른 클라이언트에서 보낸 연산을 똑같이 진행하기 때문에 굉장히 부드러워보일것이다.

 

1번 방식은 키 입력이 누락되었을 때 (키 다운 같은) 움직이지 않거나 멈추지않거나 하는 오류가 발생할 수 있다.

2번 방식은 몇 번 누락이되더라도 빠른 속도로 계속 동기화 해주기 때문에 어느정도 프레임으로 동기화하면 또한 부드러워 보일 것이다.

여기서 고민이 발생했다.

 

 

어느정도가 적당할까?

 

 

개인적으로 공부하려고 구현하는거니까 적당히 많은 량의 패킷은 괜찮지 않을까 라는 생각과

오히려 포퍼먼스가 적은 로컬에서 구동하니 최적화를 신경써야한다는 생각이 충돌했다.

 

어느 쪽이 더 좋을지는 직접 해보고 좀 더 고민해봐야겠지만 결론은! 둘다 이용하기로 했다.

찾아보면 예측, 보간 등 복잡한 연산을 더 하는데 이런 방식은 손 대보기 엄두가 안난다.

 

1번 방식으로 어떤 axis의 값이 value를 가지는지만 전송

 

(전문용어로 서버 컴퓨팅을 할 것이냐 클라이언트 컴퓨팅을 할 것이냐고 하나보다..)