본문 바로가기
학습 노트/개인학습

250611 수요일 @ 45일차

by 삼색먕 2025. 6. 12.

치과를 가서 잇몸치료를 받았는데 잇몸이 아작이나서 괜히 덧날까봐 점심을 안먹었다
그냥 굶기로 했다 원래 커피도 사올려고했는데 커피도 안좋을것같아서 안사오고
집에왔는데 너무아파가지고 누워있었다.
그러다가 인디 회의를 했는데 아무래도 인디 팀을 탈퇴해야할것같다 
인디 회의는 한다고하는데 뭘할지도 제대로 안나오고 목표가 없다보니 시간만 허비하는것같다
그래서 그냥 내일부터는 포폴을 하겠다고 그만하겠다고해야겠다.

일단 Iocp에서 ClientManager지우고 
그냥 Client는 raw*로 관리해야하겠다고 생각했다.
그래서 Client를 미리 생성해두고 (접속 가능한 최대수 제한?)
client_id (client_number)로 접근 해서 사용하도록 하고 빈클라이언트는 항상 queue에 반납하고
사용할 클라이언트는 queue에서 꺼내서 사용하도록 똑같이 옮겼다,
queue는 mutex를 사용하여 락을 걸어서 워커스레드에서 여러 동작시에도 문제가 없도록 설정한다.

1. GameServer (IocpServer 상속)
Send() -> GameServer 어디서든지 호출이 가능해야함 (Client_id / packet_data /  size)

2. PacketManagerQueue + Router (스레드1개 / Packet (In, route) 담당 )
IOCP에서 패킷 들어오면 packetmanager의 Queue에 push시키기


별도 RoutingThread로 분기하여 처리  ex 
switch (packet_id)
{
    case C2S_LOGIN:
    case C2S_CHARLIST:
        로비매니저 - > 패킷 푸시
    case C2S_MOVE:
    case C2S_ATTACK:
        맵매니저 -> 맵번호 -> 패킷 푸시
}


3. LobbyThread  (스레드1개 / lobbyPacket 처리 담당 / lobbyUser이동처리 / 전체User 위치 업데이트? )
로그인/회원가입 처리 LobbyManager의 Queue
로그인 성공 시 유저매니저?게임매니저? ->Login? MoveToGame? 등  호출하여 해당 유저를 게임 쪽으로 이관 

4. GameThread (스레드 N개 / GameMap M개를 처리 / 게임 Update / 각 맵의 Packet처리 / 각 맵의 DBResult처리 )
맵 객체, 몬스터, 유저 위치 등 포함
자신이 가진 client_id만 처리 (Thread-Safe)


5. 유저가 맵에 아직 안들어갔을경우
state로 구분하기
if (state == LoadingMap )
{
    user에 임시 큐에 넣기 (InGame 들어가서 Spawn시 해당 게임 큐에 전부 삽입
}
else if (state == InGame )
{
    맵매니저 -> 맵번호 -> 패킷 푸시
}

6. DB결과 라우팅스레드? (스레드 1개 / DB결과 queue에 있는걸 lobbyThrea , GameThread(Map)에 분배 )
7. DBQueue 처리스레드 (스레드 1개 / DB요청 처리후 DB결과 Queue에 삽입)

이정도로 생각해서 구현을 해야할것 같다 이게 구현이 되야 게임을 시작할수 있을것 같다..

'학습 노트 > 개인학습' 카테고리의 다른 글

250614 토요일 @ 48일차  (0) 2025.06.15
250613 금요일 @ 47일차 / 서버코어 library 분리  (1) 2025.06.14
250609 월요일 @ 43일차  (0) 2025.06.10
250608 일요일 @ 42일차  (0) 2025.06.09
250607 토요일 @ 41일차  (0) 2025.06.08

댓글