|
현재 PC용 3D 게임용 표준 그래픽 API로 자리잡고 있는 Microsoft의 Direct3D는 1992년 설립된
RenderMorphics라는 회사가 개발한 3D 그래픽 API인 Reality Lab을 시작으로 발전된 3D 게임용 그래픽 API이다.
Microsoft는 RenderMorphics를 1995년에 인수한뒤 Windows95부터 DirectX라는 이름으로 적용시켜왔으며 DirectX의 한부분이 되어 현재까지 계속 발전시켜오고 있다.
그럼 API, 즉 Application programming interface 라는 것은 무엇일까?.. 이름에서 쉽게 알수 있듯이 API라는 것은 프로그램과 하드웨어의 중간에 위치한 단계로써 프로그램이 원하는 작업을 하드웨어에서 알아들을수 있는 코드로 변환하여 하드웨어를 제어하는 기능을 제공한다.
3D 그래픽용 API가 포함된 DirectX도 게임이 원하는 그래픽작업을 그래픽 프로세서가 처리할 수 있도록 만들어주는 기능을 한다.
그래픽 작업은 CPU가 아닌 GPU로
지금까지의 DirectX는 CPU를 통해 처리하던 부분을 그래픽 프로세서를 통해 처리할 수 있도록 발전시켜왔다.
초기에 CPU가 부담했던 Geometry 단계 중 성능과 직결된 T&L(Transform&Lighting) 작업을 그래픽 프로세서에 포함된 T&L 엔진이 처리할 수 있는 기능을 제공하였으며 Programmable Shader를 지원하여 고정 기능의 그래픽 프로세서로는 한계가 있던 3D 그래픽 효과와 성능을 계속 개선시켜왔다.
특히 Programmable Shader의 경우 CPU에 의존하지 않고 그래픽 프로세서만의 연산 기능을 통해 다양한 그래픽 효과를 제공할 수 있어 CPU는 게임 엔진이나 Ai, 물리 엔진등을 처리하면 되는 것으로 홍보되어 왔지만 지금까지의 DirectX 구조는 완전히 CPU를 배제하고 그래픽 처리를 할 수가 없다.
CPU에 의존할 수밖에 없는 DirectX
지금까지 DirectX가 3D 그래픽용 API라는것과 계속된 발전으로 그래픽 프로세서 자체만으로 3D 그래픽을 만들어낼수 있다고 설명하였지만 API의 기능은 CPU를 통해 처리한다.
쉽게 말해 그래픽 프로세서가 움직일수 있도록 만들어주는 API의 기능은 CPU를 통해 처리된다는 것이다. 실제 CPU가 그래픽 랜더링 작업에 관여하지 않지만 가장 근본작업을 CPU가 처리해주지 않으면 그래픽 프로세서는 움직일수가 없게 된다. 물론 CPU가 처리해주지 않는 경우는 없겠지만 기본적인 Ai나 물리 엔진까지 실시간으로 처리해야하는 CPU를 통해 3D 그래픽 연산을 위한 API 작업까지 처리하게 되기 때문에 CPU 성능에 따라 해당 시스템의 3D 그래픽 랜더링 성능과 퀄리티가 달라지게 된다.
API 부분에 CPU 오버헤드가 발생하는 것은 3D그래픽 뿐만 아니라 컴퓨터의 다른 콤포넌트 분야(네트웍 분야에도 CPU 오버헤드 때문에 해당 네트웍의 전송 대역폭을 제대로 활용하지 못하는 경우가 발생된다)에도 적용되는 것이지만 3D 그래픽 분야는 문제가 심각하다.
양과 질이 제한되던 DirectX 9
3D 그래픽에서 현실과 같은 환경을 구현하는 방법은 크게 두가지로 생각해볼수 있다. 하나는 현실세계와 동일한 물제를 표현하는 것이고 또하나는 각각의 물체를 현존하는 물체와 동일하게 표현하는 것이다. 전자가 양적인 부분이고 후자가 질적인 부분인데 CPU 오버헤드에 좌우되는 API 오버헤드로 인해 양적인 부분과 질적인 부분이 모두 많은 제약이 있었다.
양적인 부분에서의 문제는 생성해낼 오브젝트 갯수의 제한 부분이다. 어떤 게임의 화면이 200개의 서로 다른 오브젝트로 구성되었다고 가정해보자. 이 게임을 실행하면 게임은 하나의 화면을 만들기 위해 200개의 오브젝트를 랜더링하기 위한 명령과 데이터를 그래픽 프로세서로 전달하려고 할 것이다. DirectX API는 이 명령을 그래픽 프로세서로 전달하기 위한 작업을 진행하겠지만 만약 CPU에 문제가 발생하여 200개의 오브젝트 처리할 명령과 데이터를 전달하지 못한다면 그래픽 프로세서는 모든 데이터가 들어올때까지 기다릴 수밖에 없다.
이런 경우 아무리 고성능 그래픽카드를 장착해도 게임의 프레임은 증가하지 못하게 된다. 게임 개발자들은 이런 문제가 발생하지 못하도록 게임을 개발할 때 제한된 갯수의 오브젝트만을 사용해 왔다.
질적인 부분의 문제도 양적인것과 비슷하다. 일반적으로 하나의 오브젝트에는 다수의 그래픽 효과가 적용되어 있다. 이 다양한 효과도 결국 API를 통해 처리되지만 상당히 높은 사이클이 필요한 부분이기 때문에 결국 CPU 오버헤드 문제로 인해 제한적인 적용만 가능하여 특정 오브젝트만을 위한 그래픽 효과보다는 다수의 오브젝트에 모두 적용될 수 있는 그래픽효과 위주로 적용될 수밖에 없었다.
이러한 문제를 해결하기 위해 Microsoft는 DirectX 10의 구조는 변경하고 몇가지 기능을 추가하여 CPU 오버헤드로 인한 API 오버헤드를 획기적으로 줄였다고 한다.
CPU 오버헤드를 줄인 DirectX 10
기존의 DirectX 구조에서는 오브젝트에 어떠한 드로우 작업이든지 실행되기 전에 해당 작업명령과 데이터를 검사하는 작업을 실행하게 되어 있다. 이런 단계를 거쳐 그래픽 프로세서에 잘못된 명령이나 데이터가 전달되는 것을 막을수 있지만 이미 처리되었던 작업이라도 해당 작업을 실행할 때마다 계속 검사 작업을 처리하게 되어 있어 불필요한 작업시간만 늘어날 뿐이었다.
DirectX 10에서는 이 부분을 수정하여 한번 검사 작업이 처리된 경우 추가 검증 없이 해당 리소스를 그대로 사용할 수 있게 만들었다.
게임에 사용되는 오브젝트들은 다수의 텍스쳐를 사용한다. 이 텍스쳐들도 동일한 것이 아닌 서로 다른 것을 사용하기 때문에 스위칭 작업시 높은 API 오버헤드가 발생하게 된다. 이러한 문제로 인해 그래픽 아티스트들은 texture atlas라는 다수의 작은 텍스쳐로 만든 하나의 텍스쳐를 사용하였지만 DirectX 9까지는 최대 사용할 수 있는 텍스쳐의 크기는 4048 x 4048로 제한되어 왔다.
이 때문에 멀티 텍스쳐가 적용되는 오브젝트의 경우 고해상도의 높은 디테일을 보여줄수 있는 텍스쳐가 적용되지 못했지만 DirectX 10 부터는 texture array라는 새로운 개념을 도입하여 각각의 array 구조마다 512개의 텍스쳐를 저장할 수 있으며 GPU가 제어하는 새로운 인스트럭션을 통해 멀티 텍스쳐 사용시에 CPU 오버헤드 부분을 개선하였다.
일반적으로 3D 화면의 구성에서 오브젝트들의 배치가 끝나면 시점에서 보이지 않는 부분의 오브젝트는 픽셀 처리 단계를 적용하지 않도록 하는 그래픽 프로세서 차원에서 자동으로 적용되는 culling기능이 적용되지만 그래도 제거되지 않고 랜더링 되는 부분이 발생하게 된다. 이런 문제가 발생하지 않게 개발자들은 predicated draw라는 기법을 사용하지만 기존 세대의 경우 GPU와 CPU가 함께 이작업을 처리하기 때문에 CPU 오버헤드나 API 오버헤드 발생 요소중에 하나였다.
DirectX 10부터는 이 기능도 GPU를 통해서만 처리될 수 있도록 만들었다.
마지막으로 DirectX 10은 stream out이라는 새로운 기능을 지원한다. 기존 세대의 구조의 경우 geometry 데이터는 무조건 Pixel Shader를 통해서만 메모리 저장할 수 있었다. 왜냐하면 Pixel Shader만이 메모리에 접근할 수 있었기 때문인데 DirectX 10은 Vertex Shader 뿐만 아니라 새롭게 추가된 geometry Shader까지도 CPU 간섭없이 다이렉트로 메모리에 데이터를 저장하고 읽어올수 있게 만들었다.
이러한 노력결과 DirectX 9 대비 DirectX 10의 CPU 오버헤드 비율은 위의 그래프 처럼 상당부분 낮아졌다. 위의 자료는 nVIDIA 자료에 의한 것이지만 게임 개발자를 위한 행사 때마다 DirectX 10에 대한 여러 정보를 제공해온 ATI도 이와 같은 정보를 소개한적이 있다. ATI는 API와 드라이버의 오버헤드가 DirectX 10에 와서는 반으로 줄어들었다고 소개하였다.
컴퓨터에서의 3D 그래픽, 특히 실시간 랜더링이 필요한 게임같은 환경은 어쩔수 없이 CPU에 의존하는 부분이 존재할 수밖에 없지만 지금처럼 계속된 발전이 있다면 양적인 발전과 질적인 발전을 통해 언젠간 CG와 동일한 화면으로 게임을 즐길수 있는 날이 다가올 것이다.
|