멀티코어와 스트리밍 - 압축과 메모리 관리


개인적으로 게임에서 스트리밍(streaming)의 중요성과 대단함을 처음 알았던 때는 던전시즈를 끝냈을 때였다. 게임을 다시 시작하지 않는 한 로딩 없이 엔딩까지 진행할 수 있었던 게임, 그 당시의 하드웨어 환경을 사용하면 참 놀라운 일이다.

이제 멀티 코어 환경의 엔진에서 스트리밍은 지원하는 것이 당연한 기본적인 특징이 되었다. 사실 다른 처리에 비하면 스트리밍은 쉬운편에 속한다. 다른 쓰레드의 잡(job)을 방해하는 일 없이 워크 쓰레드(work thread)를 사용해서 손쉽게 처리할 수있는 경우가 대부분이기 때문이다. 이 글에서는 스트리밍 지원에 있어 고려해야할 데이터 압축 몇 가지와 또 스트리밍시 간과해서는안될 메모리 관리자 설계에 대해서 이야기한다.

스트리밍 처리에 있어서 중요한 것은 데이터의 크기이다. 품질을 희생하지 않고 데이터의 크기를 줄이는 일은 백그라운드에서 계속 로딩해야 하는 스트리밍의 특성상 매우 중요하다. 여기에 응용할 수 있는 방법이 바로 압축이다. 스트리밍이 필요한 데이터는 보통 다음의 것들이 있다

  • 메쉬 데이터
  • 애니메이션 데이터
  • 텍스쳐 데이터- 노말 텍스쳐
메쉬 데이터는 다시 정점 컴포넌트들로 구분되며 이들 정점 컴포넌트는 컴포넌트의 특성에 따라 다른 압축 방법을 사용해야 한다.[1]

www.infopub.co.kr/ebook/pdf/5674-214.pdf

최근에 사내에서 메쉬 데이터를 압축해서 사용해 보니 압축율이 무려 55%나 되었다.(100메가인 경우 55메가가 되었다는 이야기.압축한 정점 컴포넌트는 normal, color, uv, bi-normal, tangent, joint indices,weight 값들이다.) 이 정도면 왜 압축을 안하는 것이 이상할 정도. 메쉬 데이터의 압축에 대한 이야기는 Floh씨의블로그에서도 찾을 수 있다.

http://flohofwoe.blogspot.com/2008/03/vertex-component-packing.html

(※한가지 의문이 드는 점은 ShaderX1에서는 uv 값을 패킹하는 경우 피해야 할 방법에 대해서 이야기하고 있는데  위의 블로그포스트에서 이야기하는 DrakenSang에서 사용한 방법은 바로 그 피해야할 방법을 사용하고 있다는 점이다.)

또 cateu님의 블로그에도 Vertex Component Packing이라는 제목으로 좋은 내용이 있으니 읽어 보길 권한다.



두 번째로는 애니메이션 데이터의 압축이 있다.  애니메이션 데이터의 압축 방법 중 하나는 캐릭터의 바운딩 박스에서 데이터의 오프셋을 계산해서 사용하는 방법이 있다.

http://ati.amd.com/developer/shaderx/shaderx_characteranimation.pdf 
(Compression 섹션 참조)

마지막으로 텍스쳐 데이터의 압축과 관련된 이슈는 여러가지 이슈가 있는데 요즘에는 대부분 DDS 포맷을 사용하므로 기본적으로 압축된포맷을 사용하는 셈이다. 여기에 한가지 더 고려해 볼만한 것은 노말맵 텍스쳐 데이터의 압축이다. 노말값은 [0, 1]사이의 값을가지므로 이것을 이용해서 노말맵 텍스쳐 데이터의 압축을 시도해 볼만한다.

http://benjaminnitschke.com/2005/09/07/NormalMapCompressorV13AndPDCInformation.aspx


그런데 스트리밍을 지원할 때에는 반드시 함께 고려해야할 중요한 것이 한가지 있는데 바로 메모리 관리이다. 스트리밍을 통해서 (메모리로) 읽어 들인다는 것은 다른 한쪽에서는 사용하지 않는 리소스를 메모리에서 내린다는 이야기가된다. 열역학의 법칙 - 에너지의 총량은 일치해야 한다 - 은 여기에도 적용이 된다. 들어간 만큼 다시 집어 넣어려면 그만큼빼야 한다.

메모리 관리를 직접 한다고 해서 스트리밍에서 메모리와 관련해서 발생하는 모든 문제들을 해결할 수 있는 것은 아니다. 예를 들어 게임 내에서 섹터들을 백그라운드 로딩을 사용해서 읽어 들이는 경우를 생각해 보자. 각 섹터마다 정해진 메모리량에 맞추어 비슷하게 메모리를 차지하도록 배경을 디자인하는 일은 레벨 디자이너의 몫이지 프로그래머가 메모리 관리자로 해결해야 하는 일은 아니다. 하지만 정교한 메모리 관리자가 없는 경우에는 이러한 작업이 힘들 뿐만 아니라 문제가 발생해도 어디에서 어떤 문제가 발생했는지 알기가 매우 힘들다. 그러므러 스트리밍을 지원할 때에는 우선 엔진 전체에 걸친 메모리 관리 정책의 수립이 선행되어야 하고 이를 바탕으로 정교한 메모리 관리자의 작성이 필요하다.


최근의 게임들은 그 규모가 점점커지고 (콘솔 게임의 플레이 시간은 더 짧아지고 있지[2]) 복잡해지고 있다. 스트리밍은 더이상 고급 기술이 아니라 현세대 엔진이라면 당연히 지원해야 하는 기본적인 기능 중의 하나이다. 이 글에서는 스트리밍과 관련한 이슈 중 압축과 메모리 관리의 두가지 관점에서 간략하게 이야기했다. 레벨의 스트리밍과 관련해서 참고할 만한 좋은 글은 던전시즈에서 사용했던 방법에 대한 내용인"The Continuous World of Dungeon Siege"와 Saint Row의 레벨 에디팅[4]에 대한 글이있다.



[1] ShaderX1, "Vertex Decompression using Vertex Shaders "(세이더 안에서 정점 압축 풀기기), Dean Calver
[2] 개발 비용과 플레이 시간은 반비례한다는 사실에 대해서 'xxx의 법칙' 같은 것이 나올 법도 하다.
[3] Dungeon Siege, "The Continuous World of Dungeon Siege",
http://www.drizzle.com/~scottb/gdc/continuous-world.htm
[4] The Creation of Saints Row's Open World Cityscape, http://www.dev3d.net/bbs/data/pds/1188110066/saintsrow.pdf

by kimsama | 2009/05/03 23:00 | MultiCore | 트랙백 | 핑백(1) | 덧글(0)

트랙백 주소 : http://kimsama.egloos.com/tb/1901622
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at CrazyXIII : KASA.. at 2009/05/10 23:29

... 이어서 Compression에 대해서, 정리했습니다. 블로그에 내용을 정리한 것이므로, 새로운 내용은 별로 없습니다. Compression.pptx참고자료도 기제되어 있지만, kimsama님의 글과 noerror님의 글도 한번 읽어보시기 바랍니다. ... more

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶