https://www.youtube.com/watch?v=yk-HD8YoyZg&list=PLy-g2fnSzUTDsS7kCzmFYn4BJK6nCs0_r&index=11
Actor
Player
NPC
Control Zone(CZ)
서버가 하는 일
패킷 처리(읽기/쓰기)
틱(Tick) 처리
매 프레임 Actor들의 상태를 업데이트하는 것
기타 시스템
경매장 같은 것
패킷과 틱 처리가 많은 부분을 차지
유저가 늘어날수록 처리해야하는 패킷과 틱이 증가한다
Ex) 5000명의 유저가 있는 서버가 1초에 10틱을 처리한다고 가정하면 유저 한명에게 한 틱을 처리하는데 0.02ms 밖에 주어지지 않는다
멀티쓰레드가 필수
멀티쓰레드
Network I/O와 Work Thread 사이에는 버퍼가 존재(큐 형태)
Network I/O는 네트워크 결과를 모두 버퍼에 저장
싱글 쓰레드
Work Thread가 1개인 경우
1프레임마다 버퍼에 모든 결과를 처리 + 틱 처리
심플한 구조 -> 락 문제, 우선순위, 데드락 등의 문제가 없음
많은 Actor를 감당할 수 없다
싱글 쓰레드 + 데디케이트 쓰레드
데디케이트 쓰레드는 특정 작업만 처리하는 쓰레드
DB I/O나 특정 기능(경매장 같은 것)을 전담해서 처리
가장 중요한 패킷과 틱 처리를 제외한 다른 기능을 별도의 쓰레드가 처리하게 하는 방법
싱글 쓰레드보다는 효율적이지만 한계가 있음
멀티 쓰레드
Work Thread가 여러 개인 경우
버퍼의 내용과 담당하는 Actor들은 각 Work Thread들이 가져가서 처리
Locking 문제
공유자원을 접근할 때 Lock을 해야한다
Actor 간에 상호작용 문제
게임의 특성 상 요청/응답 뿐만 아니라 Actor 간의 상호작용이 많다
상호작용하는 Actor들을 담당하는 Thread가 다를 경우 문제가 발생
잘못 설계하면 성능이 오히려 낮아진다
구조 설계와 구획화를 잘해야한다
멀티 프로세스
프로세스는 기본적으로 서로의 메모리에 접근 불가능
다른 프로세스에 있는 Actor는 상호작용이 불가능하다
상호작용을 할 일이 없는 Actor들을 분류해서 다른 프로세스에게 할당할 수 있다
-> 서로 다른 대륙에 있는 Actor
구획의 경계에 있는 Actor들이 문제가 될 수도 있지만 내부적으로 보완 가능하다
-> 구획 이동에 로딩이나 상호작용이 불가능한 통로를 설치
심리스 서버의 경우는 적용 불가능
'게임 서버' 카테고리의 다른 글
소켓 프로그래밍 (0) | 2023.05.27 |
---|---|
Server Authority (0) | 2023.05.27 |
게임핵 (0) | 2023.05.27 |
P2P / Relay Server (0) | 2023.05.22 |
Deterministic (0) | 2023.05.20 |