공부 41

queue 구현

stack과 비슷하게 동적으로 메모리하는 부분은 stl의 vector나 deque이용해서 쓰면 되지만 난 그냥 미리 할당된 메모리 공간에서 queue 간단하게 구현함! queue는 stack과 다르게 들어온 순서대로 데이터가 삭제된다! template class queue { public: // push element void Push(T element) { queueContainer[bottom] = element; ++bottom; } // pop top element void Pop(void) { if (bottom > top) { ++top; } } // return top element T Top(void) const { return queueContainer[top]; } // return b..

stack 구현

메모리를 동적으로 관리하거나 STL의 실제 스택처럼은 구현 안 함! 간단하게 어떤 원리로 동작하는지만 테스트하기 위한 코드임 :3 stack은 먼저 들어온 값이 가장 마지막으로 삭제 되고 가장 마지막에 들어온 값이 먼저 삭제되는 구조임 ;) #include using namespace std; template class stack { public: // push element void Push(T element) { stackContainer[size] = element; ++size; } // pop top element void Pop(void) { if (size > 0) { --size; } } // return top element T Top(void) const { return stackCon..

UE4 4.24에서 4.25로 버전 업 이슈

4.24에서는 패키징하기 위해서 Codeworks for Android 1R7u1와 NDK r14b를 이용했었음 근데 4.25로 버전 업을 하면서 더 이상 사용이 불가능해지고 Android Studio와 NDK r21을 써야 함 Android Studio를 설치하기 전엔 꼭 기존 Codeworks와 NDK 폴더 삭제해줘야 함 걍 C 디렉토리에 있는 NVPACK 폴더 삭제 권장 관련 언리얼 공식 문서 : https://www.unrealengine.com/en-US/tech-blog/updates-to-required-setup-for-android-ndk-21-in-unreal-engine-4-25

게임에서의 청킹 최적화(Optimizing game for chunked downloading)

중규모 이상의 게임을 패키징할 땐 게임 컨텐츠를 여러 개의 청크로 나눠 초반 다운로드 사이즈를 줄이고 패치 속도를 더 올리고 로딩 시간을 줄인다. PC랑 콘솔에선 큰 크기의 청크를 소수 만드는게 좋고 모바일 환경에선 작은 크기의 청크를 여러 개 만드는 게 좋다. 언리얼 엔진 4에선 청킹을 하고 분석과 최적화를 위한 툴들을 제공한다. 청킹 셋업 청크란 독립적으로 배포가 가능하고 다운로드를 할 수 있는 에셋 묶음이다. 프로젝트는 기본적으로 모든 게임의 컨텐츠를 포함하고 있는 Chunk0 이라고 부르는 한 개의 청크를 갖고 있다. 에셋들을 여러 개의 청크로 분리한 후엔 엔진은 각 청크마다 독립적으로 .pak파일을 생성해준다. 청크를 만들 땐 AssetManager을 쓰는 방법이 가장 대표적인 방식이다. 에셋을..

C++ 프로그래밍 : 런타임 타입 정보(Runtime Type Information)

C++ 프로그래밍 런타임 타입 정보(Runtime Type Information) 클래스 사이 타입 변환에 대해 두 번에 걸쳐 자세한 소개를 했다. 간단히 떠올려보면 강제 타입 변환을 비롯해 static_cast, reinterpret_cast에 관련한 성질을 중점적으로 알아봤다. 몇몇 개발자는 C++ 타입 변환 중에 자바(Java)에 필적할만한 RTTI(Runtime Type Information)를 추가적으로 소개해주면 좋겠다는 의견을 제시했다. 비록 RTTI가 C++ 개발에 많이 사용되는 편은 아니지만 C++이 현대화하고 있는 추세에 맞춰 RTTI를 한번쯤 이해하고 가는 것은 많은 도움이 될 수 있을 거라는 생각이 들었다. 따라서 이번 글에서는 C++의 RTTI를 자세히 알아보겠다. 1. 다이나믹 ..

공부/C++ \C# 2020.06.03

인라인 (Inline)

사용 목적 C++에서 함수를 호출하면 어느정도의 비용이 듭니다. 함수를 호출하기 전에 컴파일러에서 자동으로 생성하는 코드의 일부를 Prefix라고 합니다. 함수 호출하기 전, Prefix의 코드를 실행해 CPU의 레지스터 상태, 플래그 등을 스택에 저장합니다. 이 작업은 메모리와 시간을 소요해서 실행 속도를 저하 시킵니다. 메모리나 성능이 제약된 프로세서를 프로그래밍 할 땐 이런 오버헤드는 무시하지 못할 성능 저하의 요인이 됩니다. 이 오버헤드를 줄이기 위해서 인라인 키워드를 함수 앞에 붙여 사용합니다. 인라인 키워드를 붙인 함수를 호출하는 곳에 함수의 코드를 그대로 치환해 함수 호출 비용이 없습니다. 또한 이런 작업이 컴파일 도중에 일어나기 때문에 런타임 도중에 함수를 호출해서 생기는 성능 저하가 없습..

공부/C++ \C# 2018.08.08

vector의 size와 capacity

벡터의 reserve와 resize의 차이에 대해서 이해하기 위해선 size와 capacity에 대해 알고 있어야 합니다. 위 그림을 보면 capacity는 벡터의 요소(element)들을 담을 수 있는 메모리가 할당되어 있는 공간의 용량이고, size는 실제 유효한 요소(element)들의 갯수입니다. reserve 키워드는 벡터의 capacity 크기를 정할 수 있게 해줍니다. push_back 함수를 통해 새로운 요소를 추가할 때 size가 capacity보다 작으면 그냥 맨뒤의 공간에 요소를 복사해 넣고 size의 크기만 늘어납니다. 하지만 size랑 capacity의 크기가 같으면 벡터의 메모리를 재할당 해줘야 합니다. 먼저 기존 capacity보다 더 많은 메모리를 새로운 연속된 공간에 할당하..

공부/C++ \C# 2018.07.04

레퍼런스와 포인터의 차이

1. 포인터는 재할당 할 수 있습니다. 12345678int x = 5;int y = 6;int* p;p = &x;p = &y;*p = 10;assert(x == 5);assert(y == 10); 레퍼런스는 무조건 초기화 할 때 할당 해줘야 합니다. 123int x = 5;int y = 6;int& r = x; 2. 포인터는 스택에 자신 고유의 주소를 가지고 있지만 (x86 운영체제에서 4 바이트), 반면 레퍼런스는 원본 변수와 같은 메모리 주소를 공유하면서 스택 공간에 자리를 차지합니다. 레퍼런스가 원본 변수랑 같은 주소를 공유하니깐 그냥 레퍼런스를 원본의 또 다른 이름이라고 생각하면 됩니다. 참고로 포인터가 가르키는 것은 스택뿐만 아니라 힙에 있을 수 있습니다. 레퍼런스도 마찬가지입니다. 여기서 내..

공부/C++ \C# 2018.05.15