본문 바로가기
반응형

Game Engine/Gamebryo8

성능향상을 위한 방법들 1. NiPick에서의 충돌 검사 일반적으로 충돌 처리를 NiPick을 이용해서 많이 합니다. 그런데 NiPick에는 심각한 문제가 있습니다. 그것은 거리와 상관없이 해당 방향에 있는 모든 오브젝트에 대해서 검사를 한다는 것이죠. NiPick 충돌 검사 비용을 줄이기 위해서는 트라이앵글 충돌검사비용을 줄여주어야 합니다. 그렇게 하기 위해서는 경계구에서 거리가 먼경우(경계구의 중심점과 NiPick.Ray의 origin 위치사이의 거리에서 경계구의 반지름을 뺀 값)에는 아예 그 안에 들어가지 않게 하는 것입니다. 이렇게 하면 속도향상을 상당부분 줄 수 있습니다. NiPick을 이용한 충돌은 기본적으로 카메라 충돌 검사, 서있는 위치 알아오기, 이동방향에 대한 충돌 등 다양하게 적용되겠죠. 2. Update .. 2011. 9. 24.
NiAVObject::Update 게임브리오에서 노드들의 위치 및 경계구(Bounding sphere)를 업데이트하는 함수는 NiAVObject에 있는 Update 함수입니다. 초기 게임브리오 엔진(NetImmerse)에서는 Update 함수가 애니메이션을 항상 업데이트하게 되어 있었습니다. 그러나 지금은 애니메이션을 필요에 따라서 할 수 있습니다. 그 외에도 여러가지 형태로 Update를 제공하고 있습니다만, 기본적으로 비슷합니다. 가장 많이 헷갈리는 것이 바로 Update(0.0f)의 의미입니다. Update(0.0f)는 초기화과정으로 반드시 루트노드(Root node or top node)는 이 과정을 거쳐야 합니다. 이 과정이 없으면 프로그램은 정상적으로 동작하지 않으며, 심각한 오류를 발생시킵니다. 루트노드가 아니라면? 굳이 안.. 2011. 9. 24.
트리구조 게임브리오에서 가장 중요한 부분은, 트리 구성입니다. 트리 구성을 어떻게 사용하고 있는가를 분석하는 것이 가장 첫 단추라고 보여집니다. 응용프로그램을 만들자고 한다면, 렌더러를 생성하는 방법이 첫 단추겠지만요. 분석을 위해서는 트리라고 생각합니다. 트리를 구성하는 방법은 전통적으로 여러가지 방법이 존재합니다. 일단 손쉽게 생각할 수 있는 방법은 링크드 리스트입니다. 링크드리스트 방법은 순서가 보장되며, 중간에 비어있는 노드들이 없습니다. 그러나 치명적인 약점은 노드를 중복해서 매달 수 없다는 것입니다. 예를 들어서 다음과 같이 트리를 구성했다고 하죠. NiObject는 클래스 하이어라키상 최상위 클래스이고, 트리의 최상위 노드는 NiNetObject라고 하죠. 이 클래스는 실제 게임브리오와는 다릅니다. .. 2011. 9. 24.
트리구조 게임브리오에서는 트리구조를 다룸에 있어서 가변형 배열(Array)를 사용하고 있습니다. 링크드 리스트를 이용할 경우 싱글 링크드 리스트를 이용한다면, 가변형 배열과 비슷한 자료 크기를 가지고 있습니다. 그러나 가장 큰 약점은 하나의 노드를 여러개의 노드가 자식으로 가질 수 없다는 점입니다. 그렇다고 해서 게임브리오가 이 조건을 만족하는가 하면 그것은 아닙니다. 게임브리오는 기본적으로 하나의 노드를 여러개의 노드가 자식으로 가질 수 없습니다. 트리를 구성함에 있어서는 다음과 같은 경우를 따져보아야 합니다. 하나의 노드는 여러개의 부모를 가질 수 있는가? 이 것은 트리를 설계할 때 가장 중요한 부분입니다. 그래픽 엔진을 개발할 때에는 이것을 허용하는 쪽으로 하는 것이 원칙이라고 생각됩니다. 그러면 함수면에서.. 2011. 9. 23.
렌더러 생성 게임브리오에서는 여러가지 렌더러(Open GL, DirectX 8, DirectX 9, PS2)를 지원하고 있다. 그렇기 때문에 렌더러를 생성할 때 일반화된 프로그램을 작성할 수 없다. 게임브리오에서는 렌더러별로 Create 함수를 이용하여 렌더러를 생성하도록 하고 있다. 모든 렌더러는 NxRenderer 클래스를 상속받고 있으며, 모든 렌더러 함수들은 가상함수로 제공됨으로써 게임브리오 응용 프로그램에서 생성한 렌더러가 실행될 수 있도록 되어있다. Create 함수를 이용한 가상 클래스 생성에 대한 설명은 http://cafe.naver.com/dxgameprogramming/36 을 참조하길 바란다. 렌더러 생성은 다음과 같은 형태로 진행된다. 1) 렌더러 파라미터 검사 - 렌더러 파라미터는 현재 설치.. 2011. 9. 19.
스마트포인터 3D 그래픽 프로그램에는 많은 수의 오브젝트들이 생성된다. 이 오브젝트들은 메모리 절감이나 속도 향상을 위해서 공유되어 사용된다. 오브젝트의 공유는 장점도 있지만 단점도 존재한다. 오브젝트의 생성은 자유롭지만 소멸에 대해서는 자유롭지 못하다. 그래서 참조횟수(Reference counter)라는 것을 이용하여 참조횟수가 0이 되면 소멸하도록 만든다. 참조횟수라는 개념은 대부분의 그래픽 엔진(게임 엔진 포함)이 가지고 있다. 게임브리오 엔진은 NiRefObject 클래스가 참조횟수를 관리한다. 참조횟수를 증가하고 감소하기 위해서 게임브리오에서는 IncRefCount 함수와 DecRefCount 함수를 사용하고 있다. 프로그래머는 잘 짜여진 원칙에 의해서 참조횟수를 조절해주어야 할 것이다. 그렇지 않다면, .. 2011. 9. 19.
728x90