센로그

7. Game Engine Support System (3) 본문

게임/게임 엔진 기초

7. Game Engine Support System (3)

seeyoun 2023. 1. 3. 18:21

◆ 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 arraymemory 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이 어려움.

줄바꿈 기호나 읽는 방법도 신경써줘야 함 ㅠㅠ

 

'게임 > 게임 엔진 기초' 카테고리의 다른 글

6. Game Engine Support System (2)  (0) 2022.12.08
5. Game Engine Support System (1)  (1) 2022.12.08
4. Object-oriented programming (2)  (0) 2022.12.07
3. Object-oriented programming (1)  (0) 2022.12.07
2. Game Engine Architecture (2)  (1) 2022.12.07
Comments