목록Categories (1099)
KoreanFoodie's Study
[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++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 생성자를 private 하게 만든다고? 스마트 포인터에 배우다 보면, make_shared 와 new 를 이용해 스마트 포인터를 만드는 방식에 대해 배우게 된다. 이때, 효율성을 위해 make_shared 를 new 보다 선호하라는 말을 듣게 되는데, 그 이유는 명확하다(힙 할당이 2번 대신 1번 이루어지며, 같은 메모리 조각에 놓이는 데다가, new 에서 예외가 발생했을 때의 메모리 누수도 막을 수 있으니까). 그런데... 그럼에도 불구하고 new 를 사용해야 하는 경우를 보면, 크게 2가지 이유가 나온다. 커스텀 삭제자를 사용하는 경우 생성자가 private 인 경우 100번 양보해서, 1번은 그렇다 쳐도, 2번은 직관적으로 와닿지가 ..
[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 을 잘 잡아주도록 하자. 오브젝트 풀링은 아주.. 오래된 유서 깊은 기법이다. 주 목적은 메모리 파편화를 최소화하기 위해 프로그래밍 레벨에서 메모리를 효율적으로 관리하기 위함인데, 사실 주 골격은 간단하다. 메모리 조각을 담을 '풀'을 만들고, 메모리가 필요할 때 새롭게 메모리를 할당하고, 할당한 메..
[언리얼] UI 에서 애니메이션의 이벤트가 끝났음을 알려주는 방법 핵심 : 1. UI 에 삽입된 애니메이션에서 이벤트를 추가하고, 그래프에서 이벤트가 발생했을 때 호출할 함수를 C++ 에서 검색해서 연결해 주면 된다. 가끔 그런 경우가 있다. 코드로 풀어야 하는 동작과 연출을 함께 사용해야 할때, 특정 동작을 연출이 끝나는 타이밍에 의존해야 하는 경우가. 대표적으로 애니메이션이 있는데, 애니메이션이 완전히 끝나거나, 특정 시점에 왔을 때 코드에서 특정 동작을 수행하도록 만들어야 하는 케이스가 왕왕 생기곤 한다. 보통 스킬 쪽 구현을 하다보면, Notify 같은 걸 만들어서 이를 해결하기도 하지만.. UI 의 경우에는, 이벤트 트리거를 통해 이를 해결할 수 있다. 이제 예시를 보자. 일단 원하는 UI 를 ..