7. Game Engine Support System (3)
◆ Template
어떤 class가 들어와도 한번에 동작할 수 있게 하기 위함
template <class T>
◆ STL (Standard Template Library)
다양한 컨테이너들을 제공하는 C++ 표준 라이브러리
<장점>
- 굉장히 많은 컨테이너들을 제공함
- 최적화가 잘 되어있음
- 다양한 플랫폼에서 잘 돌아감
<단점>
- 개조하려고 할 때 힘듦. 헤더 파일이 암호화 되어있고 이해하기 어려움
- 여러 환경에서 잘 돌아가도록 만들어졌기 때문에, 내 환경에 특화된 것이 아님.
- generality 를 확보하기 위해 메모리를 많이 사용하고 복잡하게 만들어짐.
동적 할당 많아서 퍼포먼스적으론 뛰어나지 않음 - 컴파일러마다 작동이 조금씩 달라서 디버깅할 때 환장함
PC에서 쓰기에는 가상 메모리 있어서 나름 괜찮음. 콘솔에선 좀.. 비추
◆ Boost
STL 같은 C++ 라이브러리. STL을 보조하거나 대체하는 형태로 사용 가능
Boost Library는 Documentation이 참 잘 되어있어서 배우기 쉬움!
왜 이런 식으로 디자인 되었는지, 어떤 문제가 있고 어떻게 해결하는지 같은 게 문서에 친절하게 적혀있음.
◆ CPU Cache
처음엔 데이터가 메인메모리 어딘가에 있을거야.
Cpu가 캐쉬로가서 야 너 데이터있어~? 하는데 없음(cache miss)
그럼 매인메모리로 감. 그리고 블락 통째로 갖고와서 캐쉬에다 넣어둠
그러다가 내가 또 뭐 갖고오려고 갔는데, 캐쉬에 있어(cache hit)! 그러면 엄청 빠르게 가져올 수 있음
◆ Fixed size array
C style array는 memory allocation 필요없고, 연속된 형태로 돼있기때문에 cache friendly하고,
이런 형태의 데이터들은 데이터 새로 갖다붙이거나 search 할때도 큰 효율을 가짐
연속된 데이터가 왜 좋냐?
우리가 데이터 가져올 때 약간 큰 청크 단위로 캐쉬에 옮겨놓음.
array[0] 접근했다하더라도 0주변을 청크단위로 캐쉬로 옮김. 즉 array[1] 접근한다 해도 cache hit 발생해서 빨리 갖고옴.
근데 이게 만약 dynamic allocation이다?
그러면 데이터들이 다 떨어져있기 때문에, array[0]을 옮겨놧어도 array[1]은 멀리 있어서 cache hit 안일어남.
(멀리 존재하기 때문)ㅠㅠ
◆ Linked List
각 Node의 next 포인터로 다음 Node를 계속 연결해주는 자료 구조
동적 메모리 할당의 대표적인 자료 구조~
<장점>
크기 몰라도 포인터를 통해 동적으로 사용할 수 있음
데이터를 넣고 뺄 때 간편함
<단점>
데이터 접근을 위해 전체를 순회해야 하기 때문에 복잡도가 올라감
◆ Dictionary
Key value를 통해 데이터에 접근하는 자료 구조
Linked List처럼 모든 노드를 순회해 찾는 것은 비효율적이므로, 좀 더 빨리 찾기 위해
BST나 Hash Table을 이용해 구현함
◆ Hashing
Hash Function을 통해서 문자(Key data)를 숫자로 매칭하고, 이를 통해 빠르게 찾아가도록 함.
그런데 다른 문자에 대해 이 숫자가 겹치는 경우 --> collision 발생!
좋은 Hash Function이란?
- collision이 잘 발생하지 않으면 좋음
- 숫자가 나오는 확률이 골고루 퍼져있으면 좋음
- 빠르고 구별 가능(같은 input시 같은 결과)하면 좋음
◆ String
string 형태는 우리에게 익숙함. 게임 만들 때도 분명 많이 관리할 것임.
그러나 이 친구는 관리하고 처리하기가 굉장히 까다로움. 왜?
이유1. atomic 하지 않음
atomic type이란 int와 같이, 한번의 instruction에서 읽거나 쓰는 게 가능한 것.
비교하거나 복사할 때 int는 한번에 옮기지만, string은 char단위로 하나하나 옮김.
이유 2. localization 이 어려움
숫자는 만국 공통이지만, 문자는 국가마다 다르기 때문에 지역에 맞게 바꿔줘야 함.
그런데 내부적으로 구성도 다르고, 차지하는 메모리도 다를 수 있기 때문에 localazation이 어려움.
줄바꿈 기호나 읽는 방법도 신경써줘야 함 ㅠㅠ