728x90
MMORPG 게임에서 서버를 멀티스레드로 만드는 방법
싱글 프로세스 -> 멀티 스레드 구조로 구현
멀티 프로세스 -> 싱글 스레드 구조, 멀티 스레드 구조로 구현
요즘은 거의 대부분 멀티 코어이므로 코어의 성능을 다 쓰겠다 하면 멀티스레드 구조는 필수적이다.
멀티 스레드 구조는 처음 구조를 짤 때 설계가 매우 중요하다.
멀티스레드 만드는 방법
1. 무식하게 한다.
모든 working 스레드가 아무런 조건도 없이 그냥 모두 경쟁을 붙인다.
스레드들끼리 공유자원에 막 접근해서 막 lock을 건다.
lock을 많이 걸다보니 성능이 떨어지고 wait하는 시간이 길어지고 deadlock이 생길 확률이 올라간다.
lock이 많이 생기다 보니 race condition이 발생한다.
이러다 보니 타이밍 이슈가 생긴다. ( a가 먼저 들어가고 b가 들어가면 문제가 안 되는데 b가 먼저 들어가고 a가 들어가면 버그가 발생하는 등 )
2. Actor 기준으로 나눈다.
Actor : 캐릭터, npc, ...
- actor들이 각각의 스레드를 가지고 있고 actor 간에는 서로 컨택을 하지 않는다.
- actor간의 통신은 메시지를 통해서 이루어진다.
- actor끼리 메일을 주고받고 각각 받은 메시지 큐에 있는 걸 읽어서 처리한다.
- golang에서 제공하는 channel이 메시지 큐이다. 이 채널을 통해 actor끼리 메시지를 교환하며 통신한다.
- actor(각각의 스레드)간에 통신은 메시지만 주고받는 것이므로 통신할 때 lock을 걸 필요 없다. ( 이상적으로는 )
- 반드시 어떤 actor A가 상대방 actor B의 상태를 알고 싶은 경우가 있다. ( 상대방의 체력비례 데미지 등 )
- A가 B의 상태를 조회해야 한다.
- 이 경우 hp를 공유하기 때문에 락을 걸 수밖에 없다. -> lock을 걸 수 밖에 없는 경우가 생긴다!!
- 그렇다고 락을 안 걸고 메시지로만 하자니 메시지만의 비동기 문제도 발생한다. ( 복잡도 증가, 비동기 방식 )
락을 안 걸겠다면 actor간에 채널을 통해 메시지를 주고 받는 식으로 해야 한다.
3. system 기준으로 나눈다.
- ECS 구조
- moving system, flying system, attack system 등등...
'게임 서버 > 게임 네트워킹의 이해' 카테고리의 다른 글
게임 네트워킹의 이해4 - 소켓 프로그래밍 (2) | 2024.09.08 |
---|---|
게임 네트워킹의 이해3 - 받은 데이터 활용 방식 (2) | 2024.09.08 |
게임 네트워킹의 이해2 - TCP/UDP 프로토콜 (1) | 2024.09.07 |
게임 네트워킹의 이해 - 1 네트워킹이란? (0) | 2024.09.07 |