목록Categories (1099)
KoreanFoodie's Study
[C++ 게임 서버] 4-10. PacketSession 핵심 : 1. 간단하게 패킷을 만들어 보자. 사실 데이터에 size 와 id(프로토콜) 을 헤더로 붙이면, 그게 기본적인 패킷의 형태다. 2. Session 을 제거하고 넣을 때는 기존 컨테이너의 정합성이 깨지지 않도록 주의하자. 이를 회피하기 위해 클라가 종료될 때, 바로 세션을 제거하지 않고, 대신 Disconnect 이벤트를 등록만 한 다음 다른 쓰레드가 Dispatch 될 때 세션을 제거하게 만들 수도 있다. 저번까지는 버퍼에 우리가 보내려고 하는 문자열을 그냥 담아서 보냈다. 그런데 실제 게임에서는 이 데이터가 무슨 데이터인지에 대한 정보가 필요한데, 흔히 우리는 이것을 패킷이라고 한다. 즉, 해당 정보에 대한 메타 정보(흔히 헤더 부분에..
[C++ 게임 서버] 4-9. SendBuffer Pooling 핵심 : 1. SendBuffer 를 보낼 때마다 메모리 할당을 하지 말고, Memory Pooling 기법을 이용해서 큰 초기에 1 번만 할당을 하는 기법을 사용해 보자. 2. 실제 Session 에서는 SendBufferManager 를 이용해 버퍼를 사용할 준비(Open 함수)를 한다. SendBufferManager -> SendBufferChunk -> SendBuffer 순으로 계층이 잡혀 있다. 3. SendBufferChunkRef 타입의 인자를 각 쓰레드별로 TLS(Thread-Local Space)에 잡아 두면, 각 쓰레드 끼리 Chunk 에 접근하는 데 있어 경합을 벌일 필요가 없어 효율적이다. 또한 Lock-Free 설..
[C++ 게임 서버] 4-8. SendBuffer 핵심 : 1. Send 는 Recv 보다 살짝 복잡할 수 있다. Lock 등으로 동기화 이슈를 잘 해결해 주어야 한다. 2. Session 의 갯수가 많아질 경우, SessionManager 를 이용해 Session 을 관리해 보자. 이번 글에서는 SendBuffer 를 만들어 보자. 이전에 Send 는 Recv 보다 조금 더 복잡할 수도 있다고 얘기한 바 있는데... 그래서 그런지 Send 는 Recv 보다 아주 살짝(?) 복잡할 것이다 😅 먼저, 이전에 Session 에서 만들었던 Send 의 구현을 한 번 보자. void Session::Send(BYTE* buffer, int32 len) { // 생각할 문제 // 1) 버퍼 관리? // 2) se..
[C++ 게임 서버] 4-7. RecvBuffer 핵심 : 1. RecvBuffer 를 만들 때는, ReadPos / WritePos 와 관련한 처리를 어떻게 할 것인지가 중요하다. 2. 보통 BufferSize 보다 크게 메모리를 할당해, Clean 을 효율적으로 구현하는 방법을 많이 사용한다. 이전에 Recv 는 Send 에 비해 비교적 구조가 간단하다고 말한 적이 있다. 왜냐면... Send 는 여러 군데에서 동시에 호출하고 난리를 치지만, Recv 는 결국 멀티 쓰레드 환경일지라도 동시에 받는 것이 아니라 순차적으로 받게 되어 있으므로(논리상), 상대적으로 얌전(?) 할 수 밖에 없는 것이다 😅 물론, Recv 의 경우에도 RecvBuffer 를 어떻게 만들어야 좋을지에 대해서는 고민이 약간 필요..
[C++ 게임 서버] 4-6. Session #3 핵심 : 1. 소켓을 세션이 닫힐 때마다 Close 하지 않고, 재사용할 수 있음을 알아 두자(DisconnectEx) 2. 세션 클래스를 통신의 얼개를 만들어 두면, 서버-클라이언트 단에서는 앞으로 사실상 로직과 관련된 구현만 집중해도 된다! 이번 글에서는 세션의 구현을 마무리 지으면서, 동시에 DummyClient 에서도 세션을 통한 구현을 적용해 보도록 하겠다. 일단 이전에 Session 에서 구현했던 Disconnect 함수를 다시 보면... void Session::Disconnect(const WCHAR* cause) { if (_connected.exchange(false) == false) return; // TEMP wcout
[C++ 게임 서버] 4-5. Session #2 핵심 : 1. Session 구현에 있어, Send 는 나름 복잡한 구석이 있다. 2. 송신 버퍼를 어떻게 만들 것인지, 전송 시 여러 쓰레드가 Pending 상태로 놓였을 때, 순서가 반드시 보장되어야 하는지 등등을 생각하면서 구현해 보자. 이번 글에서는 이전에 만들었던 Session 관련 클래스에 내용을 덧붙여 보겠다. 조금 더 구체적으로 이야기하자면, Send 하는 부분을 간단하게 구현해 볼 것이다. 😉 그래서 기존의 Session 코드에서 바뀐 부분만 살짝 보면... Session.h /*-------------- Session ---------------*/ class Session : public IocpObject { public: voidP..
[C++ 게임 서버] 4-4. Session #1 핵심 : 1. 게임 세션에 대한 기본 동작과 구현을 숙지하자. 제일 중요한 것은, 흐름이다. 2. 세션에 대한 Reference Count 는 상황에 맞게 잘 처리해 주어야, IocpObject 나 Session 에서 Memory Leak 이 발생하지 않는다. 이번 글에서는, Session 클래스를 만들고 기본적인 Accept 동작을 할 수 있도록 구현을 진행해 보겠다. 먼저 Session 클래스의 구현을 한 번 보자. Session.h #pragma once #include "IocpCore.h" #include "IocpEvent.h" #include "NetAddress.h" class Service; /*-------------- Session -..
[C++ 게임 서버] 4-3. Server Service 핵심 : 1. IocpObject 는 안전성을 위해 shared_ptr 를 차용하는 것이 좋다. 2. 서버는 클라이언트와만 통신하지 않고, 다른 서버나 DB 서버와도 통신할 수 있다. 따라서 용도에 따라 세션의 생성 및 관리를 할 수 있도록, 서비스를 만들어 주면 편리하다. 우리는 이전에 IOCP Core 클래스를 만들어 핸들, 세션, 소켓과 관련한 기능들을 간단히 다룰 수 있도록 만들었다. 그런데 이전에 우리가 만든 IOCP 클래스는 리스너에서 Accept 를 받으면 세션을 임의로 생성하는 식으로 구현이 되어 있다. 그런데 사실 세션은 특정 서버에 종속되면 자유도가 떨어지게 된다. 우리는 일반적으로 게임 서버라고 하면 '클라이언트 서버' 사이의 ..
코딩 테스트를 대비하여, 알아야 할 알고리즘 목록을 정리하며 읽어보면 좋을 블로그 링크들을 연결해 보았다(제가 작성한 것은 아님). 읽어봄직한 글들에 링크를 달은 것이니, 코테로 손을 예열하기 전에 두뇌를 예열하는데 사용하면 좋겠다! 🤣 기본 정렬 - 퀵소트 - 힙소트 - 머지소트 우선순위큐(힙) 이분탐색 DFS(깊이 우선 탐색) BFS(너비 우선 탐색) 백트래킹 그리디(탐욕법) 누적합 투포인터(두 포인터) 위상정렬 DP 심화 연결 성분 (Connected Component) 다익스트라 플로이드 와샬 벨만 포드 유니온-파인드 (Disjoint set) MST(최소 스패닝 트리) 프림 크루스칼 세그먼트 트리 트라이 이분 그래프(Bipartite Graph). KMP CS CS 기초 지식
[언리얼] 다음 틱에 특정 동작 수행시키기핵심 :1. SetTimerForNextTick 을 사용한다때로는 영 좋지 못한 이유로, 특정 동작을 다음 틱에 실행시켜야 하는 상황이 존재한다.AActor* actor = GetActor();// 타이머는 클리어 처리하고 다음 틱에 디스폰 액터를 호출ClearTimerEvent();GetWorld()->GetTimerManager().SetTimerForNextTick([actor]() { actor->Destroy(); }); 그럴때는, 위 함수를 사용하면 된다. 언리얼 글 중 제일 짧은 글인 듯 하다. 😅