※ 본 아티클은 CMP MEDIA LLC와의 라이선스 계약에 의해 국문으로 제공됩니다.
멀티스레드 지형 평활화 입문
서론 멀티코어 프로세서는 주류가 되고 있다. 현재 판매되는 PC와 신형 게임 콘솔은 대부분 여러 하드웨어 스레드의 병렬 실행을 허용한다. 게임 프로그래머들로서는 이렇게 추가적인 전산 능력이 제공되는데도 사용하지 않는다면 정말 수치스러운 일이 될 것이다. 신형 콘솔은 순차처리를 실행하는(out-of-order) 코어를 보유하고 있는 것으로 보이지 않는다([Stokes05] 참조). 따라서 스레딩은 가용 실행 단위를 실제로 병행하여 사용할 수 있는 유일한 방법이다.
멀티스레드 게임 엔진은 그 작성이 까다로운 과제이다(예, [Gabb05] 참조). 렌더링이나 인공지능(AI) 조작, 물리학이나 충돌 탐지와 같은 다양한 게임 태스크는 다른 게임 태스크에서 얻는 결과의 순차적 가용성에 의존하는 경우가 많다. 게임 엔진 개발업자가 물리학이나 렌더링과 같이 다양한 게임 태스크를 병행하여(태스크 레벨 병행) 실행하기로 할 경우, 다른 태스크로부터 필요한 결과를 적시에 이용하는 것이 복잡해질 수 있다. 요컨대 동기화 비용이 크게 늘어나는 것은 바람직하지 않다. 또 다른 가능성은 데이터 병행 방식으로(예, 병행하는 4개 문자에 대한 경로 확인) 동일한 유형의 여러 문제를 해결하는 것이다. 게임 엔진의 효율성과 확장성을 위해서는 태스크 레벨과 데이터 레벨 병행의 결합을 이용하여 엔진을 구현하는 것이 이상적이다. 이는 보다 많은 코어에 대한 확장성의 이용을 보장한다. 멀티스레드 소프트웨어 개발과 관련하여, 관련 개념 전체와 코딩상의 함정을 대부분 설명하고 있는 문서를 다운로드할 수 있다([DevMTApps] 참조). 또한 VTune*(핫스팟 확인용)과 ThreadCecker*(레이스 조건 및 기타 스레딩 버그 확인용), ThreadProfiler*(로드 균형 및 기타 성능 문제 확인용)와 같은 툴은 멀티 스레드 개발 노력을 돕는 귀중한 툴이라는 점에 유의해야 한다([IntelTools] 참조). 이러한 툴의 도움으로 PC에 대해 해결하는 스레딩 문제는 다른 멀티 코어 플랫폼에 대해서도 도움이 될 수 있다. [West06]은 게임 엔진의 다양한 코어를 활용하는 방법에 대한 아이디어를 제시하는 입문을 작성하였다. 본 논문은 그의 접근방식에서 한 걸음 나아가 실시간 지형 높이 필드 평활화(그림 1 참조)를 실현하기 위한 멀티스레딩의 활용을 설명하고 있다. 지형의 가시 부분은 실시간 프레임에서 평활화되어 가시적인 지오모핑(geo-morphing)이나 파핑(popping) 없이 부드러운 LOD 이행을 달성하고 있다. 또한 최적의 방식에 가깝게 지형에 대한 최고 예산을 지출할 수 있다는 점을 확인할 수 있다.
여기서 설명하고 있는 지형 평활화는 플로팅 포인터 렌더 타깃([Bunnell05] 참조)이나 ‘Tessellation through Instancing’ ([Gruen05] 참조)을 이용하여 그래픽 카드에서도 실행할 수 있다. 또한 DirectX10*과 GeometryShaders도 조만간 사용할 수 있을 것이다. 그래도, 대다수 게임은 해상도가 낮거나 중간 정도로 제한된 프로세서이기 때문에, 프로세서 태스크를 다른 코어에 오프로드하는 것이 도움이 될 수 있다. 또한 대다수 게임은 그래픽 카드가 높은 디스플레이 해상도로 제한된다. 따라서 디스플레이 해상도가 높을 경우, 다른 작업을 위하여 그래픽 카드 파워가 절실하기 필요할 것이기 때문에 그래픽 카드에서 로드를 옮기는 것이 합리적이다. 물론 이는 모두 프로세서와 그래픽 카드 작업 부하의 균형을 유지하는 방식에 따라 달라진다. 프리 DirectX10* 하드웨어에서 멀티플 패스로 렌더링을 할 경우, 프로세서에 대한 테셀레이션은 그래픽 카드에 여러 차례 렌더링하는 것보다 속도가 빨라질 수 있다... ....................(중략)
* 자세한 내용은 첨부문서(pdf)를 참고하시기 바랍니다.
|