사용 툴 및 기술 소개
사용 프로그램
○ Unity 5.6.1f
○ Visual Studio 2013
○ MySQL
○ Autodesk 3dsMax 2014
○ Adobe Photoshop CS6
프로그래밍 언어
○ C++ ( 서버 )
○ C# ( 클라이언트 )
클라이언트 스레드 구조
○ 메인 스레드 ( 유니티 엔진 처리 )
수신 큐에 데이터가 존재하면 그에 따른 게임 처리 및 물리 처리
○ 워커 스레드1 ( 수신을 담당 )
서버에서 패킷을 수신하면 큐에 패킷을 분해하여 큐에 넣는다.
○ 워커 스레드2 ( 송신을 담당 )
송신용 딕셔너리에 송신할 데이터가 생기면 패킷으로 조립하여 서버측에 송신한다.
서버 스레드 구조 (IOCP 모델 사용)
○ 메인 스레드 ( 접속 처리 )
초기에 필요한 매니저(싱글톤)들을 생성하고 DB에 접속 이후 접속 처리만을 담당한다.
○ 워커 스레드 ( 송·수신 처리 / CPU갯수 * 2)
- 수신시 패킷 분해를 하고 분해 -> 큐에 데이터가 존재하면 그 데이터에 대한 처리
-> 데이터 처리 종료 후 WSARecvEX(사용자 정의 수신함수)함수를 호출하여 수신 완료 패킷을 기다린다.
- 수신 처리를 하면서 보낼 데이터가 생기면 조립하여 송신 큐 또는 맵(한 번에 여러가지 종류의 패킷을 송신할 경우)에 조립하여 저장
- 송신 큐의 SIZE가 1이면 WSASendEX(사용자 정의 송신함수)함수를 호출하여 백그라운드에서 송신 처리를 한다.
- 송신 완료 패킷이 도착 -> 송신 큐에 보낼 패킷이 있으면 백그라운드에서 송신 -> 송신 완료 패킷이 도착 -> 송신 큐에 보낼 패킷이 있으면 백그라운드에서 송신 … 반복
○ 게임 스레드 ( 프레임 동기화 및 게임 로직 처리 )
- 게임이 시작되는 방이 존재하면 방마다 생성되는 스레드이며 게임 종료시 소멸된다.
- 스레드 갯수가 많다는 것은 스레드 콘텍스트 스위칭간의 오버헤드가 커진다는 것으로 좋지는 않은 방법이다. (보안 필요)
- 클라이언트 간의 프레임 동기화 (30프레임)
- 게임이 진행되는 동안 모든 게임에 관련된 처리를 한다. (EX. 이동, 스킬, 상태 이상, 데미지 처리 등등)