본문 바로가기
Game Engine/Gamebryo

스마트포인터

by 작은별하나 2011. 9. 19.
반응형

3D 그래픽 프로그램에는 많은 수의 오브젝트들이 생성된다.  이 오브젝트들은 메모리 절감이나 속도 향상을 위해서 공유되어 사용된다.

오브젝트의 공유는 장점도 있지만 단점도 존재한다.  오브젝트의 생성은 자유롭지만 소멸에 대해서는 자유롭지 못하다.

그래서 참조횟수(Reference counter)라는 것을 이용하여 참조횟수가 0이 되면 소멸하도록 만든다.

 

참조횟수라는 개념은 대부분의 그래픽 엔진(게임 엔진 포함)이 가지고 있다.  게임브리오 엔진은 NiRefObject 클래스가 참조횟수를 관리한다.

 

참조횟수를 증가하고 감소하기 위해서 게임브리오에서는 IncRefCount 함수와 DecRefCount 함수를 사용하고 있다.  프로그래머는 잘 짜여진 원칙에 의해서 참조횟수를 조절해주어야 할 것이다.  그렇지 않다면, 어떤 오브젝트는 절대 소멸되지 않을 수도 있고 어떤 오브젝트는 사용중인데 소멸되버려서 프로그램 크래쉬가 발생할 수도 있다.

 

이러한 참조횟수를 관리해주기 좋은 개념이 바로 스마트포인터이다.

 

STL에 보면 스마트포인터가 이미 있다.  사실 STL을 모르기때문에 똑같은 개념인가는 모르겠다.

 

스마트포인터는 포인터에 적용된 오브젝트들의 소멸을 관리해준다.  생성된 오브젝트는 어떠한 스마트포인터에도 적용되지 않았을 때 자동 소멸한다.

 

게임브리오에서는 스마트포인터를 이용하여 씬그래프의 구성요소들을 모두 관리한다.  스마트포인터의 변수타입은 구성요소 이름+Ptr 형태이다.

 

예를 들어 NiNode 클래스라면,

일반 포인터 : NiNode *

스마트포인터 : NiNodePtr

이다.

 

또한 게임브리오에서는 스마트포인터 변수명의 앞첨자를 sp로 하는 것을 권고한다.  일반 포인터는 pk 또는 p를 권고하고 있다.

1) 스마트 포인터의 변수 선언 자체가 이미 NULL로 초기화되어 있으므로 별도의 초기화가 필요하지 않다.

2) 스마트 포인터에 다른 값이 할당되면, 기존의 오브젝트의 참조 횟수가 1 감소한다.

3) 참조 횟수가 0이 되면 자동 소멸한다.  (생성시 제외)

 

이제 간단한 예를 들어보도록 하자.

 

NiNodePtr spNode;               //  스마트포인터 변수는 NULL로 초기화된다.

spNode = new NiNode();        //  생성된 NiNode 오브젝트가 spNode 스마트포인터로 할당되어 참조횟수가 1 증가한다.

spNode = NULL;                    //  스마트포인터 변수가 NULL로 바뀌어 spNode에 할당된 NiNode 오브젝트의 참조횟수가 1 감소한다.

 

자 이렇게 함으로써 간단하게 스마트 포인터를 사용할 수 있다.

이것도 중요하니 알아두시길 바란다.

4) 스마트포인터 변수가 지역변수의 경우 함수의 종료와 함께 해당 변수의 오브젝트 참조횟수가 1 감소한다.

 

이렇게 강력한 기능의 스마트포인터에도 주의할 점들이 있다.

 

void Test( NiNodePtr spNode );          //   Test 함수의 인자가 스마트포인터이다.

NiNode *pkNode = new NiNode();        //   NiNode 객체를 하나 할당받아 일반 포인터로 저장

Test( pkNode );                                 //   Test 함수 호출

Test( pkNode );                                 //   Test 함수 재호출

 

자 이 소스는 말끔해보인다.  전혀 문제없어보이는 이 소스는 무엇이 잘못되었을까?  아시는 분은 댓글로..

 

역시 마찬가지 왕주의할 것 하나 더..

NiNodePtr Test();                            //   Test 함수의반환값이 스마트포인터이다.

NiNode *pkNode = Test();                  //   반환값을 일반포인터로 받았다.

 

이 소스의 문제점은 또 무엇일까?  한번쯤은 짚고 넘어가야할 문제이다.

 

스마트포인터의 개념을 이해했다면 쉽게 답을 할 수 있을 것이다.

 

스마트포인터를 이해했다면, 이제 게임브리오 엔진을 시작해볼 수 있다.

 

~~

 

'Game Engine > Gamebryo' 카테고리의 다른 글

트리구조  (0) 2011.09.24
트리구조  (0) 2011.09.23
렌더러 생성  (0) 2011.09.19
게임브리오 시작하기  (0) 2011.09.17
Gamebryo 엔진  (1) 2011.09.16

댓글