목록Game Dev (261)
KoreanFoodie's Study
[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 을 잘 잡아주도록 하자. 오브젝트 풀링은 아주.. 오래된 유서 깊은 기법이다. 주 목적은 메모리 파편화를 최소화하기 위해 프로그래밍 레벨에서 메모리를 효율적으로 관리하기 위함인데, 사실 주 골격은 간단하다. 메모리 조각을 담을 '풀'을 만들고, 메모리가 필요할 때 새롭게 메모리를 할당하고, 할당한 메..
[언리얼] UI 에서 애니메이션의 이벤트가 끝났음을 알려주는 방법 핵심 : 1. UI 에 삽입된 애니메이션에서 이벤트를 추가하고, 그래프에서 이벤트가 발생했을 때 호출할 함수를 C++ 에서 검색해서 연결해 주면 된다. 가끔 그런 경우가 있다. 코드로 풀어야 하는 동작과 연출을 함께 사용해야 할때, 특정 동작을 연출이 끝나는 타이밍에 의존해야 하는 경우가. 대표적으로 애니메이션이 있는데, 애니메이션이 완전히 끝나거나, 특정 시점에 왔을 때 코드에서 특정 동작을 수행하도록 만들어야 하는 케이스가 왕왕 생기곤 한다. 보통 스킬 쪽 구현을 하다보면, Notify 같은 걸 만들어서 이를 해결하기도 하지만.. UI 의 경우에는, 이벤트 트리거를 통해 이를 해결할 수 있다. 이제 예시를 보자. 일단 원하는 UI 를 ..
[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 를 ..
[C++ 게임 서버] 2-3. Allocator 핵심 : 1. C++ 에서는 new 와 delete 도 오버로딩할 수 있는데, Allocator 를 만들어 커스텀화된 new 와 delete 를 사용해 보자! 2. placement new 기법을 이용하면, 내가 지정한 메모리에 객체를 초기화할 수 있다! 놀랍게도(?) C++ 에서는 new 와 delete 를 오버로딩하여, 메모리 관리를 섬세하게 커스터마이징할 수 있다. static void* operator new(size_t size) { cout