변수가 하도 많아서 골치가 아프네요.
종일 걱정은 하고 고민은 하는데 해결은 안나는 느낌?

인터넷 돌다가 발견한 황재철군 도플갱어 사진으로 한 컷.
그렇다고 여태까지 며칠 잡고 있었는데 더 잡다간 바보될 것 같아서 정리하겠습니다.
7600GS를 기준으로 잡은 이유는 저번에 말씀드렸는데요.
- 8000 대를 기준으로 잡으면, 통합 쉐이더 프로세서로 인해서 버텍스와 픽셀 쉐이더 비율이 무의미해진다.
- 그렇지만 우리는 블소처럼 최소가 8000 이 아니기 때문에 이 비율은 중요하다.
- 7000 대 중 보유하고 있는 최고가 GS라서 아쉽. GT가 없다. (기증해주실분?) GT의 성능은 완전 다른데.
- 나중에 여러 가지 변수를 고래해 볼 때, 7600에서 제대로 돌린다면 8000 대를 권장으로 삼는다고 해도 좋을 것이다.
이렇게 해서 7600의 성능을 분석해 보았습니다.
7600 GS로 계산해 보면

7600 GT 80nm 로 계산해 보면 (숫자 높은것)

7600 GT는 정말로 성능이 팍 튀는군요. 그치만 완고하게 GS로 계산해 보겠습니다.
아시는 분은 아시겠지만, 나중에 실제 게임이 되면 이렇게 보수적으로 잡은 성능이 딱 맞아 떨어지는 경우가 많거든요.
퍼포먼스 저하요인은 무궁무진하니까요.

완고하게 양보 안할꼬야.
어쨌건 7600 시리즈로 아주 양보없이 짜게 봤을 때, 버텍스의 처리 용량 한계는 1/30 초 당
16Mega 개 (= 1천6백만개) 라는 것을 알 수 있습니다. 우와 대단.
픽셀은 당연하게도 훨씬 더 많지만, 픽셀은 굉장히 많은 요소에 좌우되며 유동적이기 때문에 여기서 정하긴 무리입니다.
특히 픽셀 쉐이더 버퍼는 이펙트와 후처리 효과등에 연관이 아주 많고, 해상도에도 영향을 많이 받기 때문입니다.
즉 픽셀은 보면서 해야 한다는. 까짓거 보면서 하지 뭐.
근데, 속으면 안됩니다. 버텍스가 몇 개라고 했지만… 이건 정말로 순수한 버텍스 (일 겁니다) 기준이 다 그렇지요 뭐.
자동차 연비가 제조사 보고만큼 나오시는 분 손?
게다가 우리의 버텍스가 순수한 버텍스일까요? 절대 그렇지 않습니다.
순수한 버텍스는 위치값만 가지고 이루어지기 때문에 매우 가볍습니다.
용량으로 따지면 다음과 같지요 .
====================================================
버텍스는 Position(위치) 정보만 가지고 있으면 된다.
Position은 X, Y, Z 값이필요. 각값은 float으로 float 1개당 4byte를쓴다.
따라서, 1개의 Position을표시하기위한용량은 4*3 = 12byte
1,000개의버텍스를가졌기때문에 12 * 1,000 = 12,000 byte = 12kb가된다.
하지만, 요즘은 Index 없이버텍스를표현하지않으므로 Index를추가한다.
Index는 버텍스를 그리는 순서를 저장하는데, 통상 버텍스보다 많다.
Index는 Integer 하나를 사용하는데, Integer 하나당 4byte를쓴다.
대략 버텍스 숫자만큼만 쓴다고 가정하면, 4 * 1,000 = 4,000 byte = 4kb가된다.
1,000개의 버텍스를 가진 기본오브젝트의 용량은 12 + 4 = 16kb이다.
* NIF의 경우 여기에 각종 정보들이 포함된 헤더가 추가되므로 용량은 이보다 늘어나게 된다.
하지만 우리가 쓸 버텍스는 그렇게 순수하지 않을 겁니다. UV도 들어갈테고, UV가 두 개가 들어갈 수도 있지요. 라이트맵 쓰면 UV가 무려 3개가 들어갑니다. 이정도 되면 버텍스보단 픽셀에서 문제가 …
게다가 노말도 들어가지요? 노말을 처리하기 위해서 버텍스에서부터 이미 데이터를 안고 가야 하는 것이 있습니다.
===================================================
만약어떤오브젝트가 Index, Position, UV1, UV2, UV3, Normal, BiNormal, Tangent를가지고있다면용량이얼마나될까?(텍스처제외, NIF 헤더제외)
버텍스 1개당용량 = Index (4) + Position (12) + UV1 (8) + UV2 (8) + UV3 (8) + Normal (12) + BiNormal (12) + Tangent (12) = 76byte
버텍스가 1,000개라면 76kb
버텍스가 10,000개라면 760kb
대충 뭐 이런거 말이죠. 이렇게 버텍스도 복잡하기 때문에, 버텍스 처리가 순수하게 제조사에서 밝히는 파워가 나온다고 생각할 수는 없습니다.
그래서 버텍스의 개수보다 버텍스의 VBO(버텍스 버퍼 오브젝트)로 제한하라는 것입니다.
이것은 버텍스가 차지하고 있는 용량을 의미하니까요. 문제는 이 그래픽 카드가 몇 메가까지 처리 가능하느냐인데…
1천6백만개의 순수 버텍스를 처리한다고 봤을때 예상되는 VBO의 용량은 16,000,000*12kb=192,000,000kb = 18750Mbyte = 18.37Gbyte
18기가….?
계산이 잘못된게 아니라면, 이미 그래픽 카드메모리 한도를 넘어가 버려도 한참 넘어가 버렸습니다. ㄷㄷㄷㄷ
버텍스가 꽤 무거워서, 최소의 데이터가 아닌 최대의 데이터라고 치면 약 6배니까 1/6 로 나누어도 3기가바이트 용량의 버텍스를 처리할 수 있다는 말이니까요.
즉 버텍스 쉐이더를 많이 써도 되겠다는 말이 되네요. 이정도라면..
이래서 버텍스 용량은 신경쓰지 말고 , 차라리 VBO의 메가수를 걱정해라라는 말이 나왔나 봅니다. 그래픽 카드의 메모리 용량이 저렇게 클리가 없으니까요.
물론 여기에서 안주할 수 만은 없습니다. 아직 여기에는 버텍스의 트렌스폼 정보 등 역시 빠져 있는 부분들이 꽤 있으니까요.
어쨌건, 확실한거 하나는 이거겠네요.
‘버텍스의 처리속도 한계는, 버텍스만이라면 정말로 신경쓰지 않아도 된다’
오히려 용량을 걱정하면 되지, 버텍스는 그래픽 카드의 메모리만큼 꽉 채워서 써도 느리지 않다 … 라는 것이겠네요. 아 물론 권장사양에서는요.
우리가 지금 로마에서 대충 권장사양으로 때려맞춰 봐도 버텍스 개수는 2Mega (한계는 16Mega) 정도밖에 안되고, VBO 용량은 30메가바이트 밖에 되지 않습니다.
그런데도 빠르지 않지요? 다시 말해서 지금 느린것은 버텍스를 줄여서만 해결할 문제는 아니라는 것입니다.
물론 버텍스를 줄이면 다른 요인들도 줄어들기 때문에 유리해 집니다만, 버텍스’만’ 줄여서 해결될 거라고 생각은 안하는게 좋다는 거겠지요.
자… 그럼 이제 이 정보 기반을 바탕으로, 실제 데이터 조사를 분석하여 결과를 도출해 내도록 하겠습니다.