게임브리오에서 가장 중요한 부분은, 트리 구성입니다.
트리 구성을 어떻게 사용하고 있는가를 분석하는 것이 가장 첫 단추라고 보여집니다.
응용프로그램을 만들자고 한다면, 렌더러를 생성하는 방법이 첫 단추겠지만요.
분석을 위해서는 트리라고 생각합니다.
트리를 구성하는 방법은 전통적으로 여러가지 방법이 존재합니다.
일단 손쉽게 생각할 수 있는 방법은 링크드 리스트입니다.
링크드리스트 방법은 순서가 보장되며, 중간에 비어있는 노드들이 없습니다. 그러나 치명적인 약점은 노드를 중복해서 매달 수 없다는 것입니다.
예를 들어서 다음과 같이 트리를 구성했다고 하죠. 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를 작성하고 있긴 하지만요.
'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 |
댓글