목록Game Dev/Game Server (78)
KoreanFoodie's Study
[C++ 게임 서버] 3-3. TCP 서버 실습 핵심 : 1. TCP 에서는 송수신 버퍼가 존재하며, 통신을 할 때 버퍼에 데이터를 담고 꺼내는 방식으로 통신이 이루어진다. 2. 클라에서 송신을 하려고 하는데 송신 버퍼가 가득 차 있거나, 서버에서 수신을 하려고 하는데 수신 버퍼가 비어 있으면 Blocking 상태에 돌입한다. 3. 신기하게도, 버퍼 내 각 데이터 별로는 명확한 경계가 없어 데이터는 합쳐지거나 쪼개져서 인식될 수 있다. 저번에 소켓 프로그래밍 기초를 다루면서, 소켓을 만들고, 주소를 할당하고, 소켓과 주소를 할당한 후, 실제로 통신을 해보는 실습을 진행했다. 이번 시간에는 TCP 실습을 해 볼 예정이다. 코드와 PPT 를 보면서, 실습을 진행해 보자. 일단 저번 시간에 소켓 바인딩 작업 ..
[C++ 게임 서버] 3-2. 소켓 프로그래밍 기초 #2 핵심 : 1. 소켓 프로그래밍 셋업에는 여러 API 들을 통한 세팅이 필요하다. 하지만 너무 겁먹지 말고, 흐름만 이해하자. 2. 클라이언트 쪽에서는 핸드폰 구입(client소켓 세팅)과 가게의 위치와 번호(서버 IP 주소와 포트)를 알아낸 후, 연결(::connect)을 시도하기만 하면 된다. 3. 서버 쪽에서는 핸드폰 구입(listen 소켓 세팅) 후, 가게의 위치와 번호(서버 IP 주소와 포트)를 설정한 후, 안내원의 폰을 개통(소켓과 서버 주소 ::bind)하고 영업을 시작(::listen)하면 된다. 이제 저번에 이야기했던 개념을 바탕으로, 실제 코드를 보자. 아마 익숙치 않은 코드가 잔뜩 등장을 하게 될 텐데, 하나하나 전부 알아야 한다..
[C++ 게임 서버] 3-1. 소켓 프로그래밍 기초 #1 핵심 : 1. 소켓 프로그래밍을 고객(클라이언트)와 가게(서버) 관계에 비유하여 개념을 이해해 두자. 드디어 기나긴 Memory 관련 포스팅을 마치고, 이제 네트워크 프로그래밍으로 들어간다. 먼저 소켓 프로그래밍을 본격적으로 시작하기 전에, 간단한 개념을 짚고 넘어가 보자. 참고로, 이해에는 예시가 최고다. 먼저, 우리가 중국집에 전화를 한다고 해 보자. 그런데 이 중국집은 유명하고 큰 곳이라, 전화를 받는 안내 요원이 따로 존재한다. 우리는 중국집에 등록된 대표 전화로 전화를 걸고, 용건을 전달한다. 그러면 안내원은 용건에 맞는 작업자의 번호를 알려준다. 그럼 이제 다음부터는 대표 전화를 통해 중국집에 연락할 필요 없이, 테이블에 앉아 있는 작업..
[C++ 게임 서버] 2-10. TypeCast 핵심 : 1. 템플릿 메타 프로그래밍(TMP)로 TypeCast 를 구현해 보자. static_cast 를 이용해 dynamic_cast 의 효과를 낼 수 있다! 2. TMP 를 사용하면, 컴파일 타임에 타입과 관련된 값을 미리 알 수 있다. 3. TypeCast 가 가능한지 여부를 행렬에 저장하여 사용할 것이므로 속도가 매우 빠르며, shared_ptr 에도 사용할 수 있다! 제목은 TypeCast 지만, 오늘은... 즐거운 흑마법 시간이다! 흑마법... 아니, 템플릿 메타 프로그래밍(Template Meta Programming; 줄여서 TMP 라고 할 것)으로, 다양한 타입 간의 Casting 을 직접 만들어 볼 것이다. 왜.. 그런 것을 하냐고? 왜..
[C++ 게임 서버] 2-9. Object Pool 핵심 : 1. ObjectPool 을 사용하면, 각 타입별로 풀을 만들게 되어, 메모리 오염 이슈가 발생했을 때 문제의 원인을 파악하기가 쉬워진다. 2. 커스텀한 삭제자를 객체 메모리를 풀에 반납하는 형식을 넣은 MakeShared 를 활용하면, ObjectPool 을 사용하는 스마트 포인터를 쉽게 만들 수 있다. 3. Allocator 를 StompAllocator 로 쉽게 교체할 수 있도록 #define 문법을 사용하면, 테스트용으로 StompAllocator 를 쉽게 적용 가능하다. 우리는 이전까지 메모리 풀에 대해 알아보았는데, 메모리 풀은 메모리 크기에 따라 객체들이 알아서 풀을 같이 사용한다. 집단 생활이 으레 그렇듯, 기숙사 생활에서도 문제..
[C++ 게임 서버] 2-8. 메모리 풀 #3 핵심 : 1. 마이크로소프트에서는, LockFreeStack 을 구현해서 이미 제공하고 있다 : SLIST_ENTRY 2. LockFreeStack 은 실질적으로 Lock-Based 구현에 비해 엄청 빠르거나 한 건 아니지만, 일단 사용하게 되면 전문용어로 '간지'가 난다. 저번 시간에는 LockFreeStack 을 이용해 Memory Pool 을 사용할 때, 각각의 entry 에 불필요한 메타 정보를 담는 것을 방지할 수 있었다. 메타 정보는 Header 에만 있으면 되기 때문이다(엔트리의 갯수가 너무 많지만 않으면). 그런데 일반적으로는 우리가 직접 만든 것을 사용하지 않고, 윈도우에서 만들어준 SLIST_ENTRY 를 사용한다. 실제 코드를 보자. ty..
[C++ 게임 서버] 2-7. 메모리 풀 #2 핵심 : 1. LockFreeStack 을 이용하여 Stack 을 관리해 보자. 이제 Entry 에 대한 메타 정보는 Header 가 관리한다! 이전 글에서는 메모리 풀을 사용함에 있어 크기별로 풀을 만들고,각 풀의 큐에 접근할 때 Lock 을 거는 방식을 사용했다. 한 발 더 나아가, 이번 글에서는 LockFreeStack 을 사용하면서 메모리 효율성을 고려한 구현을 선보이고자 한다. 사실 main 함수에서의 사용은 이전 글에서 했던 것과 거의 동일하다. 음.. 차이가 있다면, 메모리 풀을 간접적으로 거치지 않고 직접 Stack 을 만들어서 사용한다는 것인데, 일단 코드를 보자. LockFreeStack.h DECLSPEC_ALIGN(16) struct S..
[C++ 게임 서버] 2-6. 메모리 풀 #1 핵심 : 1. 메모리 풀을 이용하면, 메모리 파편화를 프로그래밍 레벨에서 어느 정도 해소함으로써 메모리를 좀 더 효율적으로 사용할 수 있다. 2. 할당에 필요한 메모리 조각의 크기에 따라 메모리 풀을 각각 만들어 사용하는 경우가 있고, 같은 사이즈만 사용하는 메모리 풀을 활용할 수도 있다. 3. 멀티 쓰레드 환경에서 메모리 풀을 활용한다면, 풀 접근 시 Lock 을 잘 잡아주도록 하자. 오브젝트 풀링은 아주.. 오래된 유서 깊은 기법이다. 주 목적은 메모리 파편화를 최소화하기 위해 프로그래밍 레벨에서 메모리를 효율적으로 관리하기 위함인데, 사실 주 골격은 간단하다. 메모리 조각을 담을 '풀'을 만들고, 메모리가 필요할 때 새롭게 메모리를 할당하고, 할당한 메..
[C++ 게임 서버] 2-5. STL Allocator 핵심 : 1. STL 자료구조에서 사용하는 allocator 대신, 우리가 직접 만든 STL Allocator 를 적용한 커스텀 STL 을 만들어 보자. 2. STL Allocator 는 allocate 와 deallocate 함수만 정의해 주면 되며, STL 특수화에서 Allocator 의 인자를 우리가 만든 STL Allocator 로 바꿔치기해주기만 하면 된다! 우리는 지난 시간에 Stomp Allocator 를 구현하면서, 메모리 할당/해제를 커스터마이징 할 수 있다는 것을 알게 되었다. 그리고 한 발 더 나아가서, 사실 STL 자료구조(vector, queue 등)을 이용할 때도, 우리가 직접 만든 allocator 를 사용할 수 있다! 이..
[C++ 게임 서버] 2-4. StompAllocator 핵심 : 1. 프로그램은 가상 메모리를 사용하므로, 메모리 오염이 즉각적으로 발견되지 않을 수도 있다. 2. StompAllocator 를 사용하면, 할당 및 해제 시 '실제로' 메모리의 할당과 해제가 일어나므로, 메모리 오염으로 인한 문제를 즉각적으로 발견할 수 있다(alloc 은 '예약' 상태밖에 사용안함). 3. PageSize 와 Granularity 등의 개념을 잘 알아두자. 일반적으로 기본 PAGE_SIZE 는 4KB, Granularity 는 64KB 이다. 이전에 언리얼 엔진과 관련된 테스트를 진행할 때, UnrealVS 를 이용해 '-stompmalloc' 테스트를 하는 내용을 포스팅한 적이 있었다. StompAllocator 를 ..