Game 클래스이 클래스는 게임의 메인 루프와 초기화를 담당합니다.
Game::Game()
{
// 생성자: 게임 초기화 수행. 여기서는 별도의 작업 없음.
}
Game::~Game()
{
// 게임 종료 시 자원 정리
GET_SINGLE(SceneManager)->Clear();
GET_SINGLE(ResourceManager)->Clear();
_CrtDumpMemoryLeaks(); // 메모리 누수 확인
}
Init: 게임 자원을 초기화합니다.TimeManager, InputManager, SceneManager, ResourceManager, SoundManager, NetworkManager.SceneManager를 통해 초기 씬을 DevScene으로 설정.NetworkManager 초기화는 서버와의 연결 설정.void Game::Update()
{
// 각 매니저 업데이트 호출
GET_SINGLE(TimeManager)->Update();
GET_SINGLE(InputManager)->Update();
GET_SINGLE(SceneManager)->Update();
GET_SINGLE(NetworkManager)->Update(); // 서버 통신 처리
}
Update: 각 매니저의 프레임 단위 업데이트.NetworkManager는 서버와의 통신을 처리.NetworkManager 클래스이 클래스는 클라이언트-서버 간 통신을 관리합니다.
Init 메서드void NetworkManager::Init()
{
SocketUtils::Init(); // 소켓 라이브러리 초기화
_service = make_shared<ClientService>(
NetAddress(L"127.0.0.1", 7777), // 서버 주소 및 포트
make_shared<IocpCore>(), // IOCP 객체
[=]() { return CreateSession(); }, // 세션 생성 콜백
1 // 워커 스레드 수
);
assert(_service->Start()); // 서비스 시작
}
IOCP 기반 비동기 통신:
IocpCore 객체는 IOCP의 핵심으로, 비동기 작업의 완료를 관리.NetAddress와 연결된 서버와 통신.멀티스레딩:
Update 메서드void NetworkManager::Update()
{
_service->GetIocpCore()->Dispatch(0);
}
Dispatch: IOCP에서 완료된 작업을 처리.0).CreateSessionServerSessionRef NetworkManager::CreateSession()
{
return _session = make_shared<ServerSession>();
}
ServerSession 객체를 생성하여 클라이언트-서버 세션 관리.SendPacketvoid NetworkManager::SendPacket(SendBufferRef sendBuffer)
{
if (_session)
_session->Send(sendBuffer); // 패킷 전송
}
ClientPacketHandler클라이언트에서 수신한 패킷을 처리하고, 서버로 전송할 패킷을 생성.
HandlePacket:void ClientPacketHandler::HandlePacket(ServerSessionRef session, BYTE* buffer, int32 len)
{
BufferReader br(buffer, len);
PacketHeader header;
br >> header;
switch (header.id)
{
case S_EnterGame:
Handle_S_EnterGame(session, buffer, len);
break;
case S_MyPlayer:
Handle_S_MyPlayer(session, buffer, len);
break;
// ...
}
}
Handle_S_EnterGame:void ClientPacketHandler::Handle_S_EnterGame(ServerSessionRef session, BYTE* buffer, int32 len)
{
PacketHeader* header = (PacketHeader*)buffer;
uint16 size = header->size;
Protocol::S_EnterGame pkt;
pkt.ParseFromArray(&header[1], size - sizeof(PacketHeader));
bool success = pkt.success();
uint64 accountId = pkt.accountid();
// 성공 여부 및 계정 ID를 기반으로 게임 초기화
}
Make_C_Move:SendBufferRef ClientPacketHandler::Make_C_Move()
{
Protocol::C_Move pkt;
MyPlayer* myPlayer = GET_SINGLE(SceneManager)->GetMyPlayer();
*pkt.mutable_info() = myPlayer->info;
return MakeSendBuffer(pkt, C_Move);
}
ServerSession클라이언트의 서버와의 통신 세션을 관리.
OnConnected:
OnRecvPacket:
virtual void OnRecvPacket(BYTE* buffer, int32 len) override
{
ClientPacketHandler::HandlePacket(static_pointer_cast<ServerSession>(shared_from_this()), buffer, len);
}
OnSend:
OnDisconnected:
IOCP (I/O Completion Port):
IocpCore가 이를 구현.멀티스레딩:
패킷 처리:
ClientPacketHandler가 클라이언트에서 수신한 패킷을 처리.더블 버퍼링:
Game 클래스에서 화면 깜빡임 방지를 위해 사용.싱글톤 패턴:
SceneManager, ResourceManager 등)는 싱글톤으로 구현.