본문 바로가기
Game Engine/Gamebryo

트리구조

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

게임브리오에서 가장 중요한 부분은, 트리 구성입니다.

트리 구성을 어떻게 사용하고 있는가를 분석하는 것이 가장 첫 단추라고 보여집니다.

 

응용프로그램을 만들자고 한다면, 렌더러를 생성하는 방법이 첫 단추겠지만요.

분석을 위해서는 트리라고 생각합니다.

 

트리를 구성하는 방법은 전통적으로 여러가지 방법이 존재합니다.

 

일단 손쉽게 생각할 수 있는 방법은 링크드 리스트입니다.

 

링크드리스트 방법은 순서가 보장되며, 중간에 비어있는 노드들이 없습니다.  그러나 치명적인 약점은 노드를 중복해서 매달 수 없다는 것입니다.

 

예를 들어서 다음과 같이 트리를 구성했다고 하죠.  NiObject는 클래스 하이어라키상 최상위 클래스이고, 트리의 최상위 노드는 NiNetObject라고 하죠.  이 클래스는 실제 게임브리오와는 다릅니다.

 

class NiNetObject : public NiObject
{
public:
    NiNetObject() { m_pNext = this;  m_pPrev = this;  }
    NiNetObject *GetNext() { return m_pNext; }
    NiNetObject *GetPrev() { return m_pPrev; }
protected:
    NiNetObject *m_pNext, *m_pPrev;
};

 

NiNode 클래스는 자식노드를 가지고 있는 클래스라고 하죠.

 

class NiNetObject : public NiObject
class NiNode : public NiNetObject
{
public:
    void AddChild(NiNetObject *pChild) 
    {  
        pChild->m_pNext = m_kRoot.m_pNext;  
        pChild->m_pPrev = &m_kRoot;
        m_kRoot.m_pNext->m_pPrev = pChild;  
        m_kRoot.m_pNext = pChild;  
    }
protected:
    NiNetObject m_kRoot;
};

 

자 이렇게 작성할 수 있겠죠.  물론 여기에는 필요한 모든 함수들이 기술되어 있지는 않습니다.

링크드리스트를 사용할줄 안다면 이 소스를 쉽게 이해하실 수 있을겁니다.

 

링크드리스트는 m_pNext, m_pPrev를 하나만 가지고 있기 때문에 다음과 같은 코드를 사용할 수 없습니다.

NiNode kNode1, kNode2;

NiNetObject kTmp;

kNode1.AddChild(&kTmp);

kNode2.AddChild(&kTmp);

 

이렇게 하면 틀림없이 에러가 발생합니다.  kNode1이 가지고 있는 링크가 완전히 깨져버리니까요.  이렇게 사용할 가능성도 다분히 존재하는 관계로 매우 위험하겠죠.

 

여러가지 이유때문에 게임브리오는 이 방법을 사용치 않습니다.  제 경우에는 이렇게 만든 링크드리스트를 이용하여 UI를 작성하고 있긴 하지만요.

 

 

728x90

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

성능향상을 위한 방법들  (0) 2011.09.24
NiAVObject::Update  (0) 2011.09.24
트리구조  (0) 2011.09.23
렌더러 생성  (0) 2011.09.19
스마트포인터  (0) 2011.09.19

댓글