NVPerfHUD 를통한 GPU 성능최적화 NVPerfHUD 3.0 성능분석을위한빈틈없는디스플레이 DU-01231-001_v01
DA-01231-001_v01 2
차례 Chapter 1. NVPerfHUD 안내... 1 1.1. 시스템요구사항...2 1.2. 권장참고자료...2 Chapter 2. 시작하기... 4 2.1. 애플리케이션준비...4 2.2. 빠른시작...6 2.3. 기본워크플로우...8 Chapter 3. 성능분석모드... 9 3.1. 성능그래프...10 3.1.1. 그래프읽기...10 3.1.2. 리소스작성모니터...14 3.2. 파이프라인실험...14 Chapter 4. 디버그콘솔모드...16 Chapter 5. 프레임분석모드...19 5.1. 렌더링분해...21 5.1.1. 경고표시...21 5.1.2. 텍스처유닛및 RTT 정보...22 5.1.3. 시각화옵션...22 5.1.4. 고급상태검사기...22 5.2. 인덱스유닛상태검사기...23 5.3. 버텍스쉐이더상태검사기...24 5.4. 픽셀쉐이더상태검사기...25 5.5. 래스터연산상태검사기...26 Chapter 6. 성능병목분석...29 6.1. 그래픽파이프라인성능...29 6.1.1. 파이프라인개요...30 6.1.2. 방법론...30 6.2. 병목점찾기...31 DA-01231-001_v01 i
6.2.1. 래스터연산병목현상...32 6.2.2. 텍스처대역폭병목현상...33 6.2.3. 픽셀쉐이딩병목현상...33 6.2.4. 버텍스연산병목현상...34 6.2.5. 버텍스및인덱스전송병목현상...34 6.2.6. CPU 병목현상...36 6.3. 최적화...38 6.3.1. CPU 최적화...38 6.3.2. 리소스잠금회수줄이기...38 6.3.3. 그리기호출최소화...39 6.3.4. 버텍스전송비용줄이기...42 6.3.5. 버텍스처리최적화...42 6.3.6. 픽셀쉐이딩속도향상...44 6.3.7. 텍스처대역폭줄이기...47 6.3.8. 프레임버퍼대역폭최적화...48 Chapter 7. 문제해결...50 7.1. 알려진문제점...50 7.2. 질문및대답 (FAQ)...51 부록 A. 드라이버는왜 GPU를원하는가...53 DA-01231-001_v01 ii
그림목록 그림 1. NVPerfHUD를활성화한 Direct3D 애플리케이션...2 그림 2. NVPerfHUD 성능분석모드...10 그림 3. NVPerfHUD 정보표시줄 ( 상단 )...11 그림 4. 성능그래프...11 그림 5. 간헐적인스파이크...12 그림 6. DP 호출그래프...13 그림 7. DP 호출히스토그램...13 그림 8. 메모리그래프...13 그림 9. 리소스작성모니터...14 그림 10. 디버그콘솔모드...16 그림 11. 프레임분석모드...19 그림 12. 인덱스유닛상태검사기...23 그림 13. 버텍스유닛상태검사기...25 그림 14. 픽셀쉐이더상태검사기...26 그림 15. 래스터연산상태검사기...27 그림 16. 파이프라인개요...30 그림 17. 병목점찾기...32 그림 18. 너무많은드라이버호출...37 그림 19. 많은사소한 DP 호출...40 그림 20. GPU를기다리는드라이버...53 DA-01231-001_v01 iii
Chapter 1. NVPerfHUD 안내 오늘날의그래픽처리장치 (GPU) 는파이프라인처리된연산시퀀스를통해이미지를만들어냅니다. 파이프라인은가장느린스테이지속도에맞춰실행되므로, 최적의성능을위해그래픽애플리케이션을조정하려면파이프라인기반접근방식이필요합니다. NVPerfHUD 는그래픽파이프라인의가장느린스테이지를인식하여애플리케이션의전체성능을향상시켜드립니다. NVPerfHUD 는한번에한스테이지에서애플리케이션성능을분석할수있도록지원하며 Direct3D 9 애플리케이션의어떤스테이지에서도성능병목현상및기능문제를진단할수있는실시간통계를표시합니다. NVPerfHUD 를활성화하면, 아래그림 1. NVPerfHUD 를활성화한 Direct3D 애플리케이션과같이애플리케이션상단에그래픽오버레이가표시됩니다. DA-01231-001_v01 1
성능을표시하는그래픽오버레이 그림 1. NVPerfHUD 를활성화한 Direct3D 애플리케이션 1.1. 시스템요구사항 모든종류의 NVIDIA GPU(GeForce 3 이상 ) GeForce 6 시리즈이상권장기존 GPU 는축소된기능을지원 NVIDIA 디스플레이드라이브 71.80 이상 Microsoft DirectX 9.0c Windows 2000 또는 Windows XP 1.2. 권장참고자료 NVIDIA 개발자웹사이트 http://developer.nvidia.com [ 링크 ] 최적의성능을위한그래픽파이프라인균형조정 백서 DA-01231-001_v01 2
[ 링크 ] NVIDIA GPU 프로그래밍안내서 최신도움말및요령 NVIDIA FX Composer 쉐이더개발환경 [ 링크 ] NVShaderPerf 쉐이더성능분석유틸리티 [ 링크 ] NVIDIA SDK 수백가지샘플및효과 [ 링크 ] 만듭니다 [ 링크 ] NVTriStrip 버텍스캐시가인식할수있는스트립을 GPU Gems: 실시간그래픽을위한프로그래밍기술, 도움말및요령 [ 링크 ] 성능관련챕터는특히유용합니다 GPU Gems 2: 고성능그래픽및일반컴퓨팅을위한프로그래밍기술 [ 링크 ] Microsoft DirectX 웹사이트 [ 링크 ] Microsoft Developer Network (MSDN) 웹사이트 [ 링크 ] " 성능 " 및 " 최적화 " 검색 Microsoft DirectX SDK 문서 설치후시작메뉴에있음 DA-01231-001_v01 3
Chapter 2. 시작하기 NVPerfHUD 는 GPU 및드라이버자체에서수치를직접수집하는디스플레이드라이버에서특수성능모니터링루틴을사용합니다. 또한, NVPerfHUD 는 API 인터셉션으로다양한수치를수집하며애플리케이션과상호작용을합니다. NVPerfHUD 를적절하게사용하는데필수적인이러한계측기술은소량의추가적인오버헤드를가져옵니다 (7% 이하 ). NVPerfHUD 를사용하여 Direct3D 애플리케이션을시작하면, NVPerfHUD 사용자인터페이스가 DirectX 그래픽상단에표시되는것을확인할수있습니다. 작동단축키를사용하면애플리케이션및 NVPerfHUD 와의상호작용을전환할수있습니다. NVPerfHUD 분석을위해애플리케이션을활성화하고, 아래빠른시작절차를실행하여 NVPerfHUD 를시작하십시오. 2.1. 애플리케이션준비 NVPerfHUD 는애플리케이션의내부기능을이해할수있도록돕는강력한성능분석도구입니다. 승인받지않은제 3 자가사용자의애플리케이션을허가없이분석하지않도록하려면, NVPerfHUD 를약간수정할필요가있습니다. NVPerfHUD 로애플리케이션을적절하게사용하는방법에대한자세한내용은이문서뒷부분에수록된문제해결을참조하십시오. 출시전에, 애플리케이션에서 NVPerfHUD 분석을비활성화상태로설정했는지확인하십시오. 그렇지않으면, 다른사람이사용자의애플리케이션에서 NVPerfHUD 를사용할수있게됩니다! 그래픽파이프라인을설정할때제일먼저해야할작업중하나는 Direct3D CreateDevice() 함수를호출하여디스플레이장치를만드는것입니다. 애플리케이션에서다음과같이보일수있습니다. HRESULT Res; Res = g_pd3d->createdevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3ddevice ); DA-01231-001_v01 4
NVPerfHUD 로애플리케이션을시작하면, 특수한 NVIDIA NVPerfHUD 어댑터가만들어집니다. 이어댑터를선택하면 NVPerfHUD 에게애플리케이션을분석할수있는권한을주는것입니다. 그뿐아니라, 일부애플리케이션에서는 NVIDIA NVPerfHUD 어댑터 ID 를무심코선택하여, 승인받지않은분석을허용하게될수있으므로장치종류를 D3DDEVTYPE_REF 로선택해야합니다. 사용자가 NVPerfHUD 어댑터를선택하지않는한, 애플리케이션에서는레퍼런스래스터장치를실제로사용하지않습니다. 애플리케이션에서 NVPerfHUD 분석을활성화하는최소한의코드변경을실시하면다음과같이보일수있습니다. HRESULT Res; Res = g_pd3d->createdevice( g_pd3d->getadaptercount()-1, D3DDEVTYPE_REF, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3ddevice ); ( 위와같이 GetAdapterCount()-1 을호출하여 ) 마지막어댑터를사용하면 NVPerfHUD 에서만든 NVIDIA NVPerfHUD 어댑터 ID 가목록의맨마지막에오는것으로가정합니다. NVIDIA NVPerfHUD 어댑터를선택하고 DeviceType 플래그를 D3DDEVTYPE_REF 로설정하는두가지작업만이애플리케이션을위해 NVPerfHUD 분석을활성화하는데필요한변경사항입니다. 둘중한가지매개변수만을변경하면, NVPerfHUD 분석을사용할수없습니다. 알고있는것처럼, 이처럼빠른구현에는한가지문제가있습니다. NVIDIA NVPerfHUD 어댑터를사용할수없는경우레퍼런스래스터장치를사용하게되어버린다는것이다. 이문제를예방하기위해, CreateDevice() 를호출하는부분을다음과같은형식으로변경할것을권장해드립니다. // 기본설정 UINT AdapterToUse=D3DADAPTER_DEFAULT; D3DDEVTYPE DeviceType=D3DDEVTYPE_HAL; #if SHIPPING_VERSION // 출시버전을구축할때 NVPerfHUD를비활성화한다 ( 옵트아웃 ) #else // 'NVIDIA NVPerfHUD' 어댑터를찾는다 // 어댑터가있으면기본설정을대체한다 for (UINT Adapter=0;Adapter<g_pD3D->GetAdapterCount();Adapter++) { D3DADAPTER_IDENTIFIER9 Identifier; HRESULT Res; Res = g_pd3d->getadapteridentifier(adapter,0,&identifier); if (strcmp(identifier.description,"nvidia NVPerfHUD") == 0) DA-01231-001_v01 5
{ } } #endif AdapterToUse=Adapter; DeviceType=D3DDEVTYPE_REF; break; if (FAILED(g_pD3D->CreateDevice( AdapterToUse, DeviceType, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3ddevice) ) ) { return E_FAIL; } 이코드는사용을원할때 NVPerfHUD 를활성화시켜주며, NVPerfHUD 를설치하지않았을때소프트웨어레퍼런스래스터장치를사용하게되는문제를예방합니다. NVPerfHUD 로애플리케이션을실행하는방법에대한자세한내용은아래빠른시작절차를참조하십시오. 2.2. 빠른시작 NVPerfHUD 와함께애플리케이션을실행하면, 기본세트의그래프와정보가애플리케이션상단에표시됩니다. NVPerfHUD 의고급기능은아래설명되어있는작동단축키를통해사용할수있습니다. 1. NVPerfHUD 설치설치프로그램이바탕화면에새아이콘을만듭니다. 2. NVPerfHUD 실행 NVPerfHUD 를처음실행하면설정대화상자가자동으로표시됩니다. 분석할애플리케이션을지정하지않고시작절차를실행하면, 언제든지구성대화상자를볼수있습니다. 3. 작동단축키선택애플리케이션에서사용하는키와충돌하지않도록주의하십시오. 4. API 가로채기구성 NVPerfHUD 가마우스및키보드이벤트를캡처하는방법을설정합니다. 애플리케이션에서지원하지않는방법을사용하면, 키보드또는마우스를사용할수없습니다. DA-01231-001_v01 6
작동단축키로 NVPerfHUD 를활성화하면, 이어지는모든키보드이벤트를 NVPerfHUD 가가로채게됩니다. 5. 선택사항 : NVPerfHUD 의 Force NON PURE 장치활성화. 애플리케이션에서 PURE 장치를사용하는경우에는 Force NON PURE 장치확인란을반드시선택해야합니다. PURE 장치를사용하는애플리케이션에서이상자를선택하지않으면, 성능모드에서프레임분석모드또는픽셀쉐이더시각화를사용할수없습니다. 6. NVPerfHUD 바탕화면아이콘으로애플리케이션끌어다놓기. 확인을클릭하여구성옵션을확인한후.EXE,.BAT.LNK( 바로가기 ) 파일을 NVPerfHUD 시작프로그램아이콘으로끌어다놓습니다. 명령줄에서 NVPerHUD.exe 를실행하여명령줄인수로분석할애플리케이션을지정할수도있습니다. 일부개발자들은배치파일작성또는 IDE 설정수정을선택하므로이현상이자동으로나타납니다. 7. 선택사항 : 애플리케이션이충돌하거나프레임분석모드에문제가있는경우에는 Delta Time 설정을 SlowMo 로변경하십시오. 이를통해, 문제가 NVPerfHUD 또는애플리케이션중어디에있는지확인할수있습니다. 자세한내용은문제해결부분을참조하십시오. 애플리케이션을지정하지않고 NVPerfHUD 를실행하면구성대화상자에언제든지액세스할수있습니다. NVPerfHUD 기본세트의그래프와정보가애플리케이션상단에표시되면서애플리케이션이실행되는지확인해야합니다. 선택한작동단축키를사용하여 NVPerfHUD 와상호작용을수행하며, F1 을눌러화면도움말을표시합니다. 애플리케이션으로돌아가려면단축키를다시누르십시오. NVPerfHUD 는 PresentationInterval 을 D3DPRESENT_INTERVAL_IMMEDIATE 로설정하여수직리프레시동기화를해제합니다. 이를통해, 애플리케이션에서병목을정확하게확인할수있습니다. DA-01231-001_v01 7
2.3. 기본워크플로우 NVPerfHUD 를구성하면그래픽파이프라인실험, 성능수치그래픽표시를수행할수있으며, 여러가지성능시각화모드를통해잠재적인문제를발견할수있습니다. 기본성능분석모드를디버그콘솔모드또는프레임분석모드로전환할수도있습니다. 디버그콘솔은 DirectX Debug 런타임의메시지와 NVPerfHUD 의경고, 애플리케이션의커스텀메시지를표시합니다. 프레임분석모드에서는그래픽파이프라인의각스테이지에대한세부사항을보여주는고급상태검사기에액세스할수있습니다. 다음키를눌러 NVPerfHUD 를활성화하면각모드로전환할수있습니다. F5 F6 F7 성능분석타이밍그래프와직접실험으로병목을확인합니다. 디버그콘솔 DirectX Debug 런타임의메시지, NVPerfHUD 경고, 애플리케이션의커스텀메시지를검토합니다. 프레임분석아래설명한상태검사기로그래픽파이프라인의각스테이지를조사하여현재프레임을중단하고한번에장면하나에대한그리기요청을단계별로처리합니다. DA-01231-001_v01 8
Chapter 3. 성능분석모드 여기에서는성능분석모드에서 NVPerfHUD 가표시하는정보를해석하는방법을설명하며, 대상성능실험을어떻게실시하여애플리케이션의성능병목현상을찾아최적화하는지설명합니다. 그림 2. NVPerfHUD 성능분석모드 는성능분석모드에서사용할수있는그래프와오버레이를나타냅니다. 유용한정보 (F1 전환 ) 배치그래프 타이밍그래프 메모리그래프 DA-01231-001_v01 9
그림 2. NVPerfHUD 성능분석모드 3.1. 성능그래프 애플리케이션을처음시작하면 NVPerfHUD 는여러가지그래프와기본성능수치를기본값으로표시합니다. 작동단축키및다음옵션을사용하면, 필요에따라그래프와정보를추가로표시할수있습니다. F1 주기적인유용한정보표시 B 배치크기히스토그램디스플레이전환 F 배경을흐릿하게처리하여그래프가독성을높임 H 그래프숨김 W 곡면 D 깊이복잡성 DirectX Debug 런타임을활성화하면타이밍그래프및직접테스트가비활성화됩니다. 디버그런타임환경의추가오버헤드및성능특성은성능분석을위한부적절한구성을만들어냅니다. 경고메시지가표시되지만그리기요청그래프, 배치히스토그램, 메모리그래프가여전히작동합니다. 3.1.1. 그래프읽기 이모드에표시되는데이터는다음과같은두가지영역으로구분됩니다. FPS 및트라이앵글 / 프레임 기본성능수치는화면왼쪽모서리에표시됩니다 ( 그림 2. NVPerfHUD 성능분석모드 ). 이두숫자들은애플리케이션이작업부하를얼마나빨리해결하는지를보여줍니다. DA-01231-001_v01 10
그림 3. NVPerfHUD 정보표시줄 ( 상단 ) 스크롤링그래프 심장박동수모니터와같은이그래프는오른쪽에서왼쪽으로모든프레임을스크롤하므로시간에따른변경사항을확인할수있습니다. 100 ms 50 ms 0 ms 그림 4. 성능그래프 녹색 = GPU_IDLE 각프레임에서 GPU 가유휴상태가되는시간합계 파란색 = DRIVER_WAITS_FOR_GPU 드라이버가 GPU 를기다려야했던누적시간 ( 이문제의원인은부록 A 를참조하십시오 ) 빨간색 = TIME_IN_DRIVER 프레임별로 CPU 가드라이버코드를실행하는데사용한시간합계. DRIVER_WAITS_FOR_GPU ( 파란색 ) 포함 노란색 = FRAME_TIME 한프레임의끝부터다음프레임까지소요된시간 이 FRAME_TIME ( 노란색 ) 라인을되도록낮게유지하려할것입니다. FRAME_TIME 17ms 34ms 50ms 75ms 100ms FPS 60 30 20 13 10 FRAME_TIME ( 노란색 ) 라인과 TIME_IN_DRIVER ( 빨간색 ) 라인의시간차이는애플리케이션로직과운영체제에의해소요된시간을의미합니다 백그라운드에서실행중인운영체제프로세스에의해스파이크형태가나타나는것을볼수있을것입니다아래그래프는이러한경우를나타냅니다. 이는하드디스크액세스, 텍스처업로드, 운영체제컨텍스트스위치등에의해발생합니다. DA-01231-001_v01 11
100 ms A B 0 m s 그림 5. 간헐적인스파이크 A 형 : 이러한스파이크는정상적인경우에도가끔발생하는데, 그이유를파악하고있어야합니다. 이러한상황이일정하게지속된다면애플리케이션에서 CPU 집약적인처리를비효율적으로진행하고있는것일수있습니다. TIME_IN_DRIVER ( 빨간색 ) 및 FRAME_TIME ( 노란색 ) 라인이동시에스파이크를만든다면, 드라이버가 CPU 에서 GPU 로텍스처를업로딩하기때문일수있습니다. B 형 : FRAME_TIME ( 노란색 ) 라인은스파이크를만들지만 TIME_IN_DRIVER ( 빨간색 ) 라인은그렇지않은경우에는애플리케이션에서 CPU 집약적인작업 ( 예, 오디오디코딩 ) 을하고있거나하드디스크에액세스하고있을가능성이높습니다. 이상황은운영체제에서다른프로세스를처리하고있는경우에도발생할수있습니다. 녹색선은 GPU 로데이터를보내지않을때스파이크를만들수있다는점을기억하십시오. DP(Draw Primitives) 그래프 이그래프는각프레임에서 DrawPrimitive, DrawPrimitiveUP 및 DrawIndexedPrimitives (DP) 가호출된회수를나타냅니다. 이정보를사용하여성능병목현상을찾아내는방법은다음페이지및 Chapter 6 의파이프라인실험에서설명합니다. 2000 1000 0 DA-01231-001_v01 12
그림 6. DP 호출그래프 배치크기히스토그램 배치크기그래프는 ( 작동단축키를사용하여 ) NVPerfHUD 를활성화한상태에서 B 키를눌렀을때만나타납니다. 단위는배치수입니다. 왼쪽으로부터첫열은 0 에서 100 개사이의삼각형, 그다음은 100 개에서 200 개사이의삼각형, 다음부터는이와같이 100 개씩증가하는삼각형수의범위를나타냅니다. 따라서작업배치를많이사용하면왼쪽이높은형태의막대가그려집니다. 2000 1000 0 그림 7. DP 호출히스토그램 메모리그래프 이그래프는드라이버에서할당한 AGP 및비디오메모리의메가바이트를표시합니다. 그림 8. 메모리그래프 DA-01231-001_v01 13
3.1.2. 리소스작성모니터 리소스작성모니터표시등은리소스를만들때마다깜박입니다. Direct3D 에서리소스를역동적으로작성하면일반적으로성능에나쁜영향을미치므로되도록자제해야합니다. 그림 9. 리소스작성모니터 모니터링되는리소스작성이벤트종류는다음과같습니다. Tex VolTex CubTex VB IB RT DSS Note: CreateTexture() 로작성된 2D 텍스처 CreateVolumeTexture() 로작성된볼륨텍스처 CreateCubeTexture() 로작성된큐브맵텍스처 CreateVertexBuffer() 로작성된버텍스버퍼 CreateIndexBuffer() 로작성된인덱스버퍼 CreateRenderTarget() 으로작성된렌더대상 CreateDepthStencilSurface() 로작성된깊이스텐실표면 리소스작성이벤트도디버그콘솔 (F6) 에로그인되므로표시등이깜박이는원인을확인할수있습니다. 3.2. 파이프라인실험 병목지점을찾으려면한번에한스테이지씩그래픽파이프라인의특정스테이지에초점을맞춰서조사를진행할필요가있습니다. NVPerfHUD 를사용하면다음과같은실험을할수있습니다. T 텍스처유닛격리 GPU 가 2 2 텍스처를사용하도록만듭니다. 프레임속도가극적으로높아지면텍스처대역폭에의해애플리케이션성능이제약을받고있는것입니다. V 버텍스유닛격리파이프라인스테이지에서버텍스유닛이후, 1 1 scissor rectangle 을사용하여모든래스터화및쉐이딩작업을클립처리합니다. 이접근방식을활용하면버텍스유닛이후의그래픽파이프라인을잘라내는것과유사한효과를낼수있으므로, 애플리케이션이버텍스쉐이더또는버스트랜잭션에의해성능상제약을받는지를판단할수있습니다. N GPU 제거이기능은모든 DrawPrimitive() 및 DrawIndexedPrimitives() 요청을무시함으로써 DA-01231-001_v01 14
무한도로빠른 GPU 를측정할수있습니다. 이프레임속도는전체그래픽파이프라인에성능비용이없을때얻을수있는수치를대략적으로나타냅니다. 상태변경에따라나타나는 CPU 오버헤드도생략된다는점을기억하십시오. 또한, 버전에따라픽셀쉐이더를선택적으로비활성화하고, 애플리케이션에서사용하는방법을시각화할수도있습니다. 특정쉐이더버전을비활성화한경우에는이그룹의모든쉐이더가같은색으로표시됩니다. NVPerfHUD 에서제공하는쉐이더시각화옵션은아래목록과같습니다. 1 고정함수 ( 빨간색 ) 2 1.1 픽셀쉐이더 ( 녹색 ) 3 1.3 픽셀쉐이더 ( 연한녹색 ) 4 1.4 픽셀쉐이더 ( 노란색 ) 5 2.0 픽셀쉐이더 ( 파란색 ) 6 2.a 픽셀쉐이더 ( 하늘색 ) 7 3.0 픽셀쉐이더 ( 오렌지색 ) 쉐이더시각화는 Direct3D 장치를 NON PURE 장치로만들때만작동합니다. NVPerfHUD 구성설정에서 NON-PURE 장치가강제로생성되도록설정할수있습니다. DA-01231-001_v01 15
Chapter 4. 디버그콘솔모드 여기에서는디버그콘솔모드에서사용할수있는정보에대해설명합니다. 디버그콘솔화면은그림 10. 디버그콘솔모드 에나와있습니다. 그림 10. 디버그콘솔모드 DA-01231-001_v01 16
디버그콘솔은 DirectX Debug 런타임을통해보고된모든메시지, OutputDebugString() 함수를통해애플리케이션에서보고된메시지, NVPerfHUD 에서감지한추가적인경고또는오류를표시합니다. NVPerfHUD 에서감지한리소스작성이벤트와경고는디버그콘솔에서도로그인됩니다. DA-01231-001_v01 17
아래옵션을통해디버그콘솔작업을사용자정의할수있습니다. C 각프레임로그지우기 S 로깅중단 F 페이드콘솔 " 각프레임로그지우기 " 확인란을선택하면프레임시작부분에서콘솔창의내용이지워지므로현재프레임에서생성된경고만을볼수있게됩니다. 이는애플리케이션에서콘솔창에적합한것보다더많은경고를프레임별로생성할때유용합니다. " 로깅중단 " 확인란을선택하면, 콘솔에서새메시지표시가중단됩니다. DA-01231-001_v01 18
Chapter 5. 프레임분석모드 여기에서는프레임분석모드와고급그래픽파이프라인상태검사기를최대한으로활용하는방법에대해설명합니다. 프레임분석모드화면은그림 11. 프레임분석모드 과같습니다. 그림 11. 프레임분석모드 왼쪽 / 오른쪽화살표키로이전 / 다음그리기요청을표시하고, 프레임분석모드를구성하는데필요한옵션을표시할수있습니다. A 고급 / 단순디스플레이전환 DA-01231-001_v01 19
S 경고표시 W 곡면 D 깊이복잡성 DA-01231-001_v01 20
5.1. 렌더링분해 렌더링개체가있는프레임을인식한경우에는장면을그린명령을확인하고, 경고의원인을자세히알아보며, 프레임분석모드를사용하여프레임내에서그리기요청을탐색할수있습니다. 프레임분석모드로전환하면 NVPerfHUD 가애플리케이션의시계를중단시키므로, 정지상태에서현재프레임을상세하게분석할수있습니다. 프레임기반애니메이션을사용하는애플리케이션에서는애니메이션객체에정지시간이영향을미치지않습니다. 프레임분석모드를효과적으로사용하려면, NVPerfHUD 가이를통제할수있도록해야합니다. 몇가지요구조건이아래기재되어있습니다. 더자세한내용은이설명서끝부분에있는문제해결을참조하십시오. 프레임분석모드에서는애플리케이션이 QueryPerformanceCounter() 또는 timegettime() win32 함수를사용하고이에의존할것을요구합니다. 애플리케이션은경과시간 (dt) 계산을강력하게처리해야하며 dt 가영 (0) 일경우에는더욱그러합니다. 다시말해, 프로그램을 dt 로구분하지말아야한다는뜻입니다. 애플리케이션을멈춘상태에서, 다음 ( 오른쪽화살표 ) 및이전 ( 왼쪽화살표 ) 키보드버튼을눌러해당프레임의모든그리기요청을단계별로확인합니다. 화면하단에있는슬라이더를앞뒤로끌거나 PgUp / PgDn 을눌러특정그리기요청을빠르게탐색할수도있습니다. 마우스또는키보드이벤트가로채기가제대로작동하지않는경우에는 NVPerfHUD 구성대화상자에서애플리케이션을종료하고대체 API 가로채기옵션을선택하십시오. 각그리기요청에표시되는정보는다음과같습니다. 직전에그린그리기요청및전체개수마지막그리기요청의함수이름및매개변수그리기요청에경고가생기면이경고메시지가함께표시됩니다. 5.1.1. 경고표시 경고표시를활성화하면, 화면상단목록상자에 DP 요청의가장중요한버텍스버퍼 (VB) 잠금을포함한경고목록이표시됩니다. 경고를클릭하면연관된 DP 요청으로직접이동합니다. 위 / 아래화살표를사용하여목록을스크롤할수도있습니다. 경고메시지가표시된상태에서 DA-01231-001_v01 21
다음 ( 오른쪽화살표 ) 또는이전 ( 왼쪽화살표 ) 을클릭하면, 화면하단의슬라이더가이전 / 다음그리기요청으로이동합니다. 잠금에사용하는시간을이해하고최소한으로만들려면각각의 VB 잠금을검사해야합니다. 이는애플리케이션에서버텍스버퍼를설정하는데사용하는 CPU 시간을이해하는데에도유용합니다. 5.1.2. 텍스처유닛및 RTT 정보 각텍스처유닛에대해표시되는정보와텍스처 (RTT) 대상에대한오프스크린렌더는다음과같이구성됩니다. 각텍스처유닛에저장된텍스처와각각의속성 : 치수 필터링매개변수 : 수정, 확대, MTP 레벨 텍스처포맷 : RGBA8, DXT1, DXT3, DXT5 등 텍스처대상 : 1D, 2D, 볼륨텍스처, NP2 등 현재그리기요청이오프스크린텍스처 (RTT) 로렌더링되면, 해당 텍스터의내용과속성이화면가운데표시됩니다. 화면에적합한것보다많인텍스처가사용되는경우에는스크롤막대로목록을확인할수있습니다. 5.1.3. 시각화옵션 프레임분석모드는여러가지시각화옵션을지원합니다. D 깊이복잡성 : 이옵션은붉은빛으로추가블렌딩을켭니다. 화면이밝아질수록더많은버퍼에손을대게됩니다. 버퍼프레임 RMW( 읽기-수정- 쓰기 ) 가증가되면컬러값도 8 씩늘어납니다. 최대값은 32 RMW 입니다. 화면컬러가포화되면, 애플리케이션에서프레임버퍼를너무자주덮어써제한된성능병목을채우게될수있습니다. W 곡면 : 곡면렌더링을강제하는옵션이므로장면의기하복잡성을시험할수있습니다. 5.1.4. 고급상태검사기 고급 (A) 버튼을클릭하면고급상태검사기가활성화됩니다. 화면하단에있는슬라이더를사용하여탐색을계속할수있지만, 화면상단에도그래픽파이프라인의각스테이지에대한여러버튼이생깁니다. 버튼을클릭하거나단축키를눌러각검사기를전환할수있습니다. 1 인덱스유닛 버텍스데이터페치 2 버텍스쉐이더 버텍스쉐이더실행 DA-01231-001_v01 22
3 픽셀쉐이더 픽셀쉐이더실행 4 래스터연산 프레임버퍼에서의포스트쉐이딩연산 Note: 각 NVPerfHU 상태검사기에표시되는상태정보에대한자세한내용은 DirectX SDK 최신버전과함께설치된문서를참조하십시오. 각스테이지를클릭하면, 현재그리기요청에서이스테이지에발생한나타난생황을자세하게알아볼수있습니다. 아래에서는각상태검사기에의해표시되는정보를설명합니다. 5.2. 인덱스유닛상태검사기 이상태검사기를선택하면, 현재그리기요청시인덱스유닛에대한정보가표시됩니다. 그림 12. 인덱스유닛상태검사기 DA-01231-001_v01 23
이그리기요청과연관된기하의회전하는곡면렌더링이화면가운데경계선상자안쪽에표시됩니다. Note: 이버전에서는점과라인을지원하지않습니다. 다음으로, 이그리기요청에대한버텍스데이터를가져오는데사용한모든정보 ( 아래참조 ) 를보여주는목록상자가나타납니다. 그리기요청매개변수및반환플래그인덱스및버텍스버퍼형식, 크기등 FVF 인덱스유닛상태검사기를사용하는경우에는애플리케이션에서보낸배치가정확한지곡면렌더링을살펴보아야합니다. 예를들어, 매트릭스팔레트스키닝및렌더링이손상된경우에는버텍스버퍼 / 인덱스버퍼의레퍼런스포스처가정확한지확인해야합니다. 이레퍼런스포스처가정확한경우, 이기하의렌더링손상은버텍스쉐이더나잘못된버텍스무게가원인일수있습니다. 인덱스형식이올바른지도확인해야합니다. 되도록 16 비트인덱스를사용하도록하십시오. 5.3. 버텍스쉐이더상태검사기 이상태검사기를선택하면, 현재그리기요청시버텍스쉐이더에대한정보가표시됩니다. DA-01231-001_v01 24
그림 13. 버텍스유닛상태검사기 합니다. 버텍스쉐이더프로그램과관련상수, 텍스처가조사를위해표시됩니다. 버텍스쉐이더가주소레지스터 ( 예, 매트릭스팔레트스키닝 ) 를사용하는경우에는모든상수가표시됩니다. 각텍스처샘플러에대한정보도레퍼런스로표시됩니다. + / 키를사용하여표시된텍스처배율을조정하십시오. 버텍스쉐이더상태검사기를사용할때에는 현재그리기요청에예상한버텍스쉐이더가적용되었는지검사해야 상수가 #NAN 또는 #INF 가아닌지확인해야합니다. 5.4. 픽셀쉐이더상태검사기 이상태검사기를선택하면, 현재그리기요청시픽셀쉐이더에대한정보가표시됩니다. DA-01231-001_v01 25
그림 14. 픽셀쉐이더상태검사기 합니다. 픽셀쉐이더프로그램과관련상수, 텍스처가조사를위해표시됩니다. 각텍스처샘플러에대한정보도레퍼런스로표시됩니다. + / 키를사용하여표시된텍스처배율을조정하십시오. 픽셀쉐이더상태검사기를사용할때에는 현재그리기요청에예상한픽셀쉐이더가적용되었는지검사해야 상수가 #NAN 또는 #INF 가아닌지확인해야합니다. 텍스처및렌더 - 텍스처가제대로사용되었는지확인해야합니다. 5.5. 래스터연산상태검사기 이상태검사기를선택하면, 현재그리기요청시래스터연상 (rop) 에대한정보가표시됩니다. DA-01231-001_v01 26
Note: 래스터연산상태검사기에표시되는상태정보에대한자세한내용은 DirectX SDK 최신버전과함께설치된문서를참조하십시오. 그림 15. 래스터연산상태검사기 이그리기요청에대한포스트쉐이딩래스터연산정보가검사를위해표시됩니다. 표시되는정보는다음과같습니다. 렌더대상형식 백버퍼형식 값비싼프레임버퍼처리의원인이될수있는렌더상태는다음과같습니다. Zenable Z 연산비교 Fillmode 래스터화모드 ZWriteEnable 깊이버퍼에 Z 쓰기여부 AlphaTestEnable 알파테스트사용 SRCBLEND 및 DSTBLEND 혼합연산정의 AlphablendEnable 프레임버퍼의애플리케이션혼합 DA-01231-001_v01 27
Fogenable 안개사용 Stencil enable 스텐실버퍼에쓰기활성화 StencilTest. 래스터연산상태검사기를사용할때에는 혼합이제대로작동하지않으면, 백버퍼향식에알파상수가진짜로있는지확인해야합니다. 불투명객체를 blendenable 로그리지않도록해야합니다. DA-01231-001_v01 28
Chapter 6. 성능병목분석 6.1. 그래픽파이프라인성능 지난몇년동안하드웨어가속렌더링파이프라인은복잡도가계속증가했으며, 이와더불어성능특성역시점점복잡하고혼란을야기하는방향으로변하고있습니다. 예전에는단순히렌더링루프내의 CPU 주기를줄이면성능을높일수있었으나, 지금은병목지점을찾은후이것을체계적으로최적화해나가는일련의주기로변화되었습니다. 이러한 발견과최적화 라는반복적인과정은가장느린스테이지만큼만속도만낼수있는것이파이프라인이라는확실한사실에기초하여, 이종멀티프로세서시스템을조율하는기본적인개념입니다. 논리적으로결론을내려볼때, 단일프로세서시스템에서는섣부르고초점없는최적화로도어느정도의성능향상을가져올수있지만, 멀티프로세서시스템에서는이정도의최적화로어떠한성능향상도가져올수없습니다. 그래픽최적화에엄청난노력을투자하고도성능을향상시키지못한다는것은재미없는일이것입니다. 여기에서는 NVPerfHUD 를어떻게사용하여병목을찾아내는지설명하여, 사용자가시간을낭비하지않도록하는것이목표입니다. DA-01231-001_v01 29
6.1.1. 파이프라인개요 최상위레벨에서파이프라인은 CPU 와 GPU, 두부분으로구분됩니다. 그림 16. 파이프라인개요 은 GPU 안에병렬처리가가능한여러개의기능단위와병목이발생할수있는여러개의지점이있다는것을보여줍니다. 이때, 기능단위는본래특수목적을위해분리된프로세서로볼수있습니다. 여기에는버텍스및인덱스인출, 버텍스쉐이딩 ( 변형및조명 ), 픽셀쉐이딩, 텍스처로딩, 래스터연산 (ROP) 등이있습니다. 그림 16. 파이프라인개요 6.1.2. 방법론 병목지점을찾는과정이없이최적화를한다는것은많은개발노력을헛되게만드는결과를초래할수있습니다. 그런의미에서최적화과정을다음과같은기본적인 발견과최적화 루프로정형화해볼수있습니다. 인식파이프라인의각단계에서 NVPerfHUD 를사용하여그단계만분리해내어실험을합니다. 성능이변한다면병목지점을찾은것입니다. 이와비슷하게애플리케이션에서그단계의작업량을변화시키는실험을구현하여병목점을찾을수도있습니다. 최적화위과정을통해병목점을발견된스테이지에서, 성능이더이상증가하지않거나원하는수준에도달할때까지작업량을줄입니다. 반복원하는수준에도달할때까지 1 단계와 2 단계를반복합니다. DA-01231-001_v01 30
6.2. 병목점찾기 병목점을찾는것은최적화싸움의절반을차지하는과정이라고말할수있습니다. 이를바탕으로, 최적화노력의초점을어디에맞출것인지에대한현명한판단을내릴수있기때문입니다. 그림 17. 병목점찾기 은애플리케이션에서정확한병목점을찾아가는일련의과정을나타낸순서도입니다. 여기에서는프레임버퍼연산 ( 래스터연산이라고도함 ) 과함께파이프라인의맨끝에서출발하여 CPU 에서끝을맺는다는점에주목해야합니다. 또한, 단일기본도형 ( 주로삼각형 ) 은명백하게하나의병목점을갖는데, 그병목점차체가프레임흐름속에서변할가능성이높다는것입니다. 그렇기때문에파인프라인중둘이상의스테이지에서작업부하를수정하면성능에변화가생기는경우가자주발생합니다. 예를들어로우폴리곤으로만들어진스카이박스의경우픽셀쉐이딩또는프레임버퍼접속에의해처리속도가제한되는반면, 적은수의픽셀에매핑되는스킨메시의경우 CPU 또는버텍스처리에의해속도가제한됩니다. 그렇기때문에, 객체별또는재질별로작업량을변화시켜보는것이도움이되는경우도있습니다. DA-01231-001_v01 31
그림 17. 병목점찾기 애플리케이션이 CPU 제한적이라고의심되는경우에는언제든지 N 을눌러보십시오. 애플리케이션의프레임속도가크게늘어나지않으면, CPU 제한적인애플리케이션입니다. 6.2.1. 래스터연산병목현상 파이프라인의끝에위치한래스터연산 (ROP) 은깊이와스텐실을읽고쓰는작업을담당합니다. 여기에는깊이와스텐실값비교연산, 컬러값읽고쓰기, 알파블렌딩및테스팅과같은작업들이있습니다. 보다시피, ROP 관련작업들은프레임버퍼대역폭을소비합니다. 애플리케이션이프레임버퍼대역폭에의해제한되는지알아보는가장좋은방법은컬러와깊이버퍼의비트값을바꿔보는것입니다. 32 비트에서 16 비트로비트값을낮췄을때성능이크게개선되면, 프레임버퍼대역폭에의해제약을받고있는것이분명합니다. 프레임버퍼대역폭은 GPU 의메모리클럭속도에의해좌우됩니다. DA-01231-001_v01 32
6.2.2. 텍스처대역폭병목현상 텍스처대역폭은메모리로부터텍스처를가져올때마다소모됩니다. 메모리에대한방대한요청을최소화하기위해최신 GPU 에는텍스처캐시가있지만, 텍스처를메모리로부터가져오는작업은여전히필요하며그때마다상당히큰메모리대역폭이소모됩니다. NVPerfHUD 를실행중일때 T 를누르면애플리케이션의모든텍스처가 2x2 텍스처로바뀝니다. 이렇게하면텍스처를가져오는속도가훨씬빨라지며, 텍스처캐시관련응집성을그대로가져올수있습니다. 이렇게해서성능이크게증가하면, 텍스처대역폭에의해제약을받고있는것입니다. 텍스처대역폭도 GPU 의메모리클럭속도에따라좌우됩니다. 6.2.3. 픽셀쉐이딩병목현상 픽셀쉐이딩은컬러값과깊이값을포함한픽셀을생성하는데사용되는실제비용을가리킵니다. 즉, 픽셀쉐이더 를실행하는데드는비용을말합니다. 픽셀쉐이딩과프레임버퍼대역폭은 채움속도 라는단어로모호하게설명되기도합니다. 둘다화면의해상도와관련이있기때문입니다. 하지만이둘은분명차이가있으며, 그차이를정확하게구분해내는것은효과적으로병목현상을찾고최적화하는데매우중요합니다. 픽셀쉐이딩이병목현상을알아내는첫번째단계는 NVPerfHUD 를사용하여모든쉐이더를아주단순한쉐이더로바꿔버리는것입니다. 이렇게하려면, 성능분석상태 에서픽셀쉐이더프로필을한번에하나씩작동해제하고프레임속도의변화를지켜보십시오. 이로인해성능이향상된다면, 문제의원인은픽셀쉐이딩일가능성이높습니다. 다음단계는 NVShaderPerf 또는 FX Composer 의 Shader Perf 패널을통해가장비용이많이드는쉐이더가무엇인지알아보는것입니다. 픽셀쉐이더비용은픽셀하나를기준을한것이므로, 값이비싸다하더라도적은수의픽셀에영향을미치는쉐이더가많은수의픽셀에영향을미치는쉐이더에비해성능관련문제를일으킬가능성이적다는점을기억하십시오. 기본적으로 쉐이더비용 = 픽셀당비용 * 영향을받는픽셀의수 입니다. 가장비용이많이드는쉐이더에성능최적화노력을집중하십시오. DA-01231-001_v01 33
FX Composer 에는쉐이더의성능비용을줄이는데유용한여러가지쉐이더최적화관련설명서가들어있습니다. 최신버전의 FX Composer 와 NVShaderPerf 는 NVDIA GPU 의전제품군에걸쳐쉐이더성능을분석할수있도록지원합니다. 둘다 http://developer.nvidia.com 에서구할수있습니다. 6.2.4. 버텍스연산병목현상 렌더링파이프라인중에서버텍스변형단계는버텍스속성들 ( 모델공간좌표, 버텍스노멀, 텍스처좌표등 ) 을받아서클리핑연산과래스터화에적합한속성들 ( 이종클립공간좌표, 버텍스라이팅계산결과, 텍스처좌표등 ) 을만드는것을담당합니다. 물론이단계의성능은버텍스당필요한연산의수와처리해야할버텍스의수에달려있습니다. 버텍스처리가병목점인지판단하는법은애플리케이션을 NVPerfHUD 와함께실행한다음 V 키를눌러스버텍스유닛를분리해버리면간단합니다. 그렇게했을때프레임속도가원래의프레임속도와거의같다면, 애플리케이션이버텍스 / 인덱스버퍼 AGP 에의한전송, 버텍스쉐이더유닛또는비효율적인 lock 과그로인한 GPU 스톨 (stall) 같은요인들중하나에의해제약을받고있는것입니다. 비효율적인 lock 을배제하려면, 애플리케이션을 Direct3D 디버그런타임으로구동한후오류메시지나경고메시지가없다는것을확인합니다. 6.2.5. 버텍스및인덱스전송병목현상 파이프라인중 GPU 부분의첫단계는 GPU 에의해버텍스와인덱스를가져오는것입니다. 버텍스및인덱스페치성능은실제버텍스와인덱스가어느부분에위치해있는지에따라달라질수있습니다. 일반적으로버텍스와인덱스는시스템메모리에존재하거나로컬프레임버퍼메모리에존재합니다. 시스템메모리에존재한다는것은곧, 버텍스와인덱스가 AGP 또는 PCI-Express 와같은버스를통해 GPU 로전달될것임을의미합니다. 많은경우, 특히 PC 플랫폼에서이러한결정은애플리케이션이아니라장치드라이버에맡기는데, 그대신애플리케이션은최신그래픽 AGI 를통해드라이버가적당한메모리유형을고르도록사용힌트를제공할수있습니다. 인덱스버퍼와버텍스버퍼를애플리케이션에서최적의방식으로사용하는것에관해서는 NVIDIA GPU 프로그래밍가이드 [ 링크 ] 를참조하십시오. 버텍스와인덱스페치중에어느것이병목점인지는버텍스포맷크기를바꿔보면알수있습니다. DA-01231-001_v01 34
버텍스와인덱스페치성능은그데이터들이시스템메모리에있는경우에는 AGP/PCI-Express 의전송속도에달려있으며, 로컬프레임버퍼메모리에있는경우에는메모리클럭에달려있습니다. DA-01231-001_v01 35
6.2.6. CPU 병목현상 애플리케이션이 CPU 에의해제약을받는지알아보는데에는두가지방법이있습니다. 애플리케이션성능이 CPU 에의해제약을받는지알아보는한가지간단한방법은 NVPerfHUD 의타이밍그래프에있는녹색 (GPU Idle) 라인을살펴보는것입니다. 녹색라인이그래프바닥에서수평상태를유지한다면 GPU 가결코유휴상태가아닌것입니다. 하지만그녹색라인이그래프바닥에서상승한다면, 이는 CPU 가 GPU 에충분한작업을전송하고있지못하고있음을의미합니다. N 키를눌러 GPU 를분리해내는방법으로도애플리케이션의제약을알수있습니다. 이것을할때에는, NVPerfHUD 가 Direct3D 런타임에강제하여모든 DP 호출을무시하게합니다. 그렇게해서나온프레임속도는무한정으로빠른 GPU 와디스플레이드라이버를사용해서얻을수있을프레임속도와거의같습니다. 애플리케이션성능이 CPU 에의해제약을받고있다면 (GPU 를공급할수없을정도로바쁘다면 ) 다음과같은원인에의한것일수있습니다. 너무많은 DP 호출 호출마다드라이버오버헤드가있습니다. 관련설명은아래그림 18. 너무많은드라이버호출 을확인하십시오. 애플리케이션의로직, 물리로직등에대한요구 - 노란색 (FRAME_TIME) 라인과빨간색 (TIME_IN_DRIVER) 라인의격차는애플리케이션에할당된 CPU 의양을나타냅니다. 리소스의로딩또는할당 예를들어, 드라이버는텍스처별로처리를하므로, 드라이버가많은 ( 다량의 ) 텍스처를로딩하느라바쁜동안에는 GPU 가모든보류작업을마무리할수도있습니다. 0. 그림 8. 메모리그래프 를참조하십시오. DA-01231-001_v01 36
100 ms 0 ms 그림 18. 그림 18. 너무많은드라이버호출 너무많은드라이버호출 은애플리케이션이드라이버에너무많은호출을하고있을때의일반적인경우를나타냅니다. 배치수를보고하는그래프를함께보면서이시나리오를다시한번점검합니다. DA-01231-001_v01 37
6.3. 최적화 이제우리는병목점이어디인지찾았으므로, 애플리케이션의성능을높이기위해그특정단계를최적화해야합니다. 다음에나온최적화방법은애플리케이션의전체성능을향상시킬수있도록단계별로정리한것입니다. 6.3.1. CPU 최적화 애플리케이션은복잡한물리로직또는 AI 로인해 CPU 에의한제약을받을수도있습니다. 부족한배치크기와리소스관리때문에성능에저하가올수도있습니다. 애플리케이션이 CPU 에의해제약을받고있다는것을알게되었다면, 렌더링파이프라인에서 CPU 작업량을줄일수있도록다음과같은방법을시도해보십시오. 6.3.2. 리소스잠금회수줄이기 리소스는텍스처또는버텍스버퍼일수있습니다. GPU 리소스에대한접근을요구하는동기화연산을수행할때마다, GPU 파이프라인을통째로작동중단시킬가능성이있는데, 그렇게되면 CPU 와 GPU 주기에모두비용이발생합니다. CPU 는 GPU 파이프라인이요청한리소스를빼서넘겨줄때까지기다리면서루프를돌아야하기때문에 CPU 주기를낭비하게됩니다. 그런다음파이프라인이유휴상태로있으면서다시채워넣어야하기때문에, GPU 주기도낭비하게됩니다. 이러한현상은다음과같은작업을할때발생할수있습니다. 이전에렌더링하고있었던표면을잠그거나그표면에서데이터를읽어들일때텍스처또는버텍스버퍼와같이, GPU 가데이터를읽어들이는표면에쓰기를할때 바쁜리소스를잠그면파란색 (DRIVER_WAITS_FOR_GPU) 라인을높이는데기여합니다. 드라이브가 GPU 를기다리게만드는것들에대한자세한내용은부록 A 를참조하십시오. 비효율적인잠금작업을배제하려면, 애플리케이션을 Direct3D 디버그런타임으로구동한후오류메시지나경고메시지가없다는것을확인하십시오. 리소스에대한잠금작업을효율적으로관리하는법에관해서는다음백서를참고하십시오. http://developer.nvidia.com/object/dynamic_vb_ib.html DA-01231-001_v01 38
6.3.3. 그리기호출최소화 도형을그리는모든 API 함수호출은그와관련한 CPU 비용을갖고있습니다. 따라서 API 호출의수를최소화하고특히그래픽상태변화의수를최소화하면렌더링해야하는특정한수의삼각형에사용할 CPU 의양을최소화할수있습니다. 배치 (batch) 는 DirectX9 에서 DrawPrimitive() 와 DrawIndexedPrimitive() 같은하나의 API 렌더링호출로렌더링한도형 (primitive) 그룹 으로정의합니다. 그리고배치의 크기 는그배치에포함된도형의수를가리킵니다. DA-01231-001_v01 39
NVPerfHUD 를사용하면배치작업을제대로수행하고있는지알수있습니다. B 키를누르면한프레임에서한번의그리기호출당삼각형의수의배치를나타내는막대그래프를볼수있습니다. 그림 19. 많은사소한 DP 호출 는적은수의도형으로너무많은 DP 호출을하기때문에수행능력이떨어질것으로예상되는애플리케이션을나타냅니다. 2000 1000 0 그림 19. 많은사소한 DP 호출 DP 호출수를줄이려면다음과같은방법을시도해보십시오. triangle strip 을사용한다면, 분해된스트립 (strip) 을붙이기위해 퇴화된 삼각형을사용하십시오. 이방법을쓰면여러개의스트립을보낼수있습니다. 단, 한번의그리기호출에재질을공유해야합니다. NVTristrip 라이브러리는이에대한소스코드를제공하는 http://developer.nvidia.com 에서얻을수있습니다. 텍스처페이지를사용하십시오. 서로다른객체가서로다른텍스처를사용하면배치가자주나뉘어집니다. 여러개의텍스처를하나의 2D 텍스처에배열하고텍스처좌표를적절하게정리하면, 한번의그리기호출로여러개의텍스처를사용하는도형을보낼수있습니다. 그러나이기법은밉매핑및앤티앨리어싱에관한문제가있습니다. 이러한문제를비켜가는한가지기법은개별 2D 텍스처를큐브맵의면에넣는것입니다. NVIDIA SDK 최신버전에는텍스처페이지를만들고미리보는텍스처아틀라스도구가포함되어있습니다. 버텍스쉐이더의상수메모리를매트릭스에대한룩업테이블로사용합니다. 다수의작은객체가같은재질을사용하더라도매트릭스상태만다르면, 배치가깨지는경우가자주발생합니다 ( 예를들어숲속에잇는비슷한나무들 ). 이러한경우, 여러개의매트릭스를버텍스쉐이더상수에로딩하고객체별로인덱스를버텍스포맷으로상수메모리에저장합니다. 그러면, 이인덱스를사용하여버텍스쉐이더에있는상수메모리를조회하고정확한변형매트릭스를사용하여한번에 N 개의객체를렌더링할수있습니다. 화면내에동일한메시가여러개존재한다면 geometry instancing 을사용합니다. 이기법을사용하면, 하나의그리기호출과두개의버텍스 DA-01231-001_v01 40
스트림으로동일한메시객체를여러개그릴수있습니다. 메시의각복사본또는 인스턴스 는서로다른위치에서, 서로다른모습으로그릴수있습니다. 두개의스트림중한스트림은인스턴스가될메시의한개복사본을포함하고있고, 다른스트림은인스턴스별데이터 ( 예를들어세계변환, 컬러등 ) 를포함하고있습니다. 그런다음, 한번그리기호출을전송하여몇개의인스턴스를그리고싶은지알려줄수있습니다. 일반적으로, geometry instancing 은많은그리기호출의 CPU 오버헤드를줄여주기때문에낮은폴리곤 (100 개이하 ) 의객체를여러개가질가장유용합니다. geometry instancing 의한가지예 ( 전체소스코드포함 ) 도최신버전의 NVIDIA SDK 에들어있습니다. DA-01231-001_v01 41
배치크기를늘리기위해 GPU 쉐이더분기를사용합니다. 최신 GPU 는쉐이더내에분기 (branching) 를허용하는유연한버텍스 / 픽셀처리파이프라인을가지고있습니다. 예를들어두개의배치가하나는 4-bone 스키닝버텍스쉐이더를필요로하고다른하나는 2-bone 스키닝버텍스쉐이더를필요로하기때문에분리되어있다고한다면, 그대신블렌딩가중치 (weight) 를누적하면서필요한본 (bone) 수만큼반복하고그가중치가결국 1 이될때루프를빠져나오는버텍스쉐이더를작성할수있을것입니다. 이렇게하면, 두개의배치를하나로합칠수있을것입니다. 쉐이더분기를지원하지않는아키텍처에서모든것에 4 bone 버텍스쉐이더를사용하고 4 개미만의 bone 으로된영향력을가진버텍스에 bone 가중치를그냥없앰으로써쉐이더주기를희생하고이와비슷한기능을구현할수있습니다. 결정은파이프라인에서되도록나중으로미룹니다. 광택을위해배치를쪼개서픽셀쉐이더상수값을설정하는것보다, 텍스처의알파채널을사용하는것이더빠릅니다. 마찬가지로, 텍스처에쉐이딩데이터를넣으려면더큰배치전송을고려할수있습니다. 6.3.4. 버텍스전송비용줄이기 최신애플리케이션에서는버텍스전송이병목이되는경우가드물지만, 이것이문제가되는것도불가능하지만은않습니다. 버텍스, 또는더가능성이희박하게는인덱스의전송때문에애플리케이션에병목이생긴다면, 다음과같은방법을시도해봅니다. 버텍스포맷에서가능한한작은바이트를사용합니다. 바이트 (byte) 단위로충분하다면모든것에 float 를사용하지않습니다 ( 예를들어컬러 ). 버텍스프로그램내에서유도가가능한버텍스속성을입력버텍스포맷속에저장하지않고생성합니다. 예를들어 tangent, binormal, normal 의경우는두가지만있으면나머지하나는버텍스프로그램내교차곱을사용하여유도할수있기때문에세개를전부버텍스포맷으로저장할필요가없습니다. 이기법은버텍스전송률대신버텍스처리속도를우선한것입니다. 32 비트인덱스대신 16 비트인덱스를사용합니다. 16 비트인덱스는가져오고옮기는비용이싸고메모리를덜필요로합니다. 비교적순차적으로버텍스데이터에접근합니다. 최신 GPU 캐시메모리는버텍스를가져올때접근합니다. 여느메모리체계와같이, 참조의공간적지역성 (spatial locality of reference) 은캐시적중률을극대화하여, 대역폭요구량을줄입니다. 6.3.5. 버텍스처리최적화 버텍스처리역시최신 GPU 에서는병목이되는경우가드물지만, 사용패턴과대상하드웨어에따라문제가될가능성이있습니다. 버텍스처리가애플리케이션의병목점이라는것을알았다면, 다음과같은방법을시도해봅니다. DA-01231-001_v01 42
객체별연산을 CPU 쪽으로뺍니다. 객체별또는프레임별로바뀌는연산은편의를위해버텍스쉐이더에서이루어질때가많습니다. 예를들어, 직선광원 (directional light) 벡터를시선공간 (eye space) 으로변환하는연산은간혹버텍스쉐이더에서이루어집니다. 대신, 이연산의결과는프레임별로바뀔뿐입니다. post-tnl 버텍스캐시를위해최적화합니다. 최신 GPU 는최근에변환된버텍스의결과를저장하는작은 FIFO 캐시를가지고있습니다. 이캐시가적중하면그이전에파이프라인에서이루어진모든작업과더불어, 모든변환및조명작업을구할수있습니다. 이캐시를활용하려면, 반드시 indexed primitive 를사용해야하고, 버텍스의순서를재배치하여메시에서참조의지역성이극대화되도록해야합니다. 이러한작업에도움이되는툴로는 D3DX 함수와 NVTriStrip 이있으며, 무료로구할수있는툴입니다. NVTriStrip 은 http://developer.nvidia.com/object/nvtristrip_library.html 에서제공합니다. 처리할버텍스수를줄입니다. 이것은근본적인문제는거의못되지만, 정적 LOD 세트와같이, 단순한 LOD(level of detail) 계획을사용하면확실히버텍스처리부하를줄일수있습니다. 버텍스를처리할때 LOD 를사용합니다. 처리할버텍스의수를줄이는데 LOD 를사용하는것과더불어, 실제버텍스연산자체에 LOD 를시도해봅니다. 예를들어, 멀리있는인물의경우완전한 4-bone 스키닝을할필요가없습니다. 그리고조명의경우더비용이저렴한근사치로할수도있을것입니다. 재질이멀티패스로이루어진다면, 멀리있는낮은 LOD 의경우패스의수를줄이면버텍스처리비용을줄일수도있을것입니다. 정확한좌표공간을사용합니다. 좌표공간의선택이버텍스프로그램에서값을연산하는데필요한명령의수에영향을미칠때가많습니다. 예를들어, 버텍스라이팅을할때, 버텍스노멀이객체공간에저장되어있고라이트벡터가시선공간에저장되어있으면, 버텍스쉐이더내에서두벡터중어느하나를변환시켜야할것입니다. 그러나 CPU 에서객체별로라이트벡터가객체공간으로한번변형되었다면, 버텍스별변환은필요없을것이며, 그에따라 GPU 버텍스명령도줄어들것입니다. 버텍스분기를사용하여연산을빨리끝냅니다. 버텍스쉐이더에서여러개의광원에대해루프가돌아가고있고정상적인 low dynamic range[0..1] 라이팅을사용하고있다면, 1 에대한포화상태를점검할수있지만, 광원에서먼곳으로향하고있다면더이상의연산을수행하지않을수있습니다. 이와비슷한최적화가스키닝의경우에도일어날수있는데, 이경우에는가중치합계가 1 에도달했을때 ( 따라서모든이어지는가중치가 0 이될것이다 ) 연산을멈출수있습니다. 이것은 GPU 가버텍스분기를구현하는방식에따라달라지며, 모든아키텍처에대해성능향상을보장하지도않는다는점을주의합니다. DA-01231-001_v01 43
6.3.6. 픽셀쉐이딩속도향상 길고복잡한픽셀쉐이더를사용하고있다면, 픽셀쉐이더에의한제약을받고있을가능성이높을때가많습니다. 이경우에는다음과같은방법들을시도해보십시오. 먼저깊이를렌더링합니다. 주된쉐이딩패스를렌더링하기전에깊이 ( 컬러제외 ) 만렌더링하면, 픽셀쉐이딩과프레임버퍼메모리의양을줄임으로써성능을크게증대할수있습니다. 특히, 깊이복잡도가높은화면의경우더욱그렇습니다. 깊이만으로된패스를 100% 활용하려면, 단순히프레임버퍼에컬러쓰기를해제하는것만으로는부족합니다. 컬러는물론깊이에영향을미치는쉐이딩작업을비롯하여, 픽셀에대한모든쉐이딩작업을비활성화해야할것입니다. 이른 z 값최적화로픽셀처리를줄입니다. 최신 GPU 는눈에안보이는픽셀을쉐이딩하지않는데전념하는실리콘이있지만, 이것은현재시점까지의장면에대한정보에좌우되므로, 대강앞에서뒤의순서로렌더링함으로써판단에큰도움을줄수있습니다. 또한, 앞에나와있듯이별도의패스에서먼저깊이를규정하면쉐이딩깊이의복잡도를 1 까지효과적으로줄일수있으므로그뒤에이어지는패스 ( 여기에서, 비용이많이드는모든쉐이딩작업이이루어짐 ) 를크게가속화할수있습니다. 복잡한함수를텍스처에저장합니다. 텍스처는룩업테이블로광범위하게사용할수있으며, 아울러그결과를공짜로필터링하는장점을덤으로얻을수있습니다. 여기서표준적인예는정규화큐브맵 (normalization cubemap) 이있으며, 이것을사용하면, 텍스처룩업한번에드는비용을소요하여높은정밀도에서자의적인벡터를정규화할수있습니다. 픽셀단위작업을버텍스쉐이더로옮깁니다. 버텍스쉐이더에있는객체별작업을 CPU 로옮겨야하는것과같이, 버텍스별연산 ( 화면공간안에서정확하게선형보간할수있는연산도포함 ) 은버텍스쉐이더로옮겨야합니다. 일반적인예로, 벡터연산하기, 벡터를좌표계상에서변환시키기등이있습니다. 가능한한낮은정밀도를사용합니다. DirectX 9 와같은 API 는양을위한픽셀쉐이더코드나낮은정밀도로작업할수있는연산의경우에정밀도힌트를지정할수있습니다. 많은 GPU 는이힌트를활용하여내부정밀도를낮추고성능을향상시킬수있습니다. 불필요한정규화를피합니다. 흔히저지르는실수중하나는지나칠정도로정규화를선호하여, 연산을수행할때매단계에서모든단일벡터를정규화하는것입니다. 어떤변환이정규직교기저 (orthonormal basis) 에의한변환처럼길이를보존하는지, 그리고어떤연산이큐브맵룩업과같이벡터의길이에따라달라지는지파악합니다. 가능하면 50% 정밀도의정규화를사용합니다. 50% 정밀도로정규화하는것은 NV4x 클래스의 GPU 에서는거의비용이안드는연산입니다. HLSL 에서정규화를수행할벡터에 half 유형을사용합니다. DirexX 9 에서 ps_2_0 이상버전의어셈블리쉐이더를사용한다면, nrm_pp 명령어를 DA-01231-001_v01 44
사용하십시오. ( 또는그와같은모든연산에 _pp 수정자를사용하십시오.) HLSL 쉐이더를테스트할때에는생성된어셈블리를점검하여, half 데이터유형을적절하게사용했는지확인하기위해정규화를하는것에해당되는연산에서 _pp 수정자를사용하고있는지확인하는것이좋습니다. HLSL 쉐이더에서생성된어셈블리는 fxc.exe 또는 FX Composer 의 Shader Perf 패널을실행하여확인할수있습니다. 또는 NVShaderPerf 의명령줄유틸리티를사용할수도있습니다. 픽셀쉐이더에 LOD 를사용하는것을고려합니다. 버텍스 LOD 만큼영향력이큰것은아니지만 ( 왜냐하면멀리있는객체는원근법때문에픽셀처리과정에자연적으로 LOD 가적용되기때문 ), 표면에있는패스의수를줄여나가는것과동시에원거리에서쉐이더의복잡도를줄여나가면픽셀처리부하를줄일수있습니다. 6.3.7. 텍스처대역폭에의한제약을받지않도록합니다. 자세한내용은아래 DA-01231-001_v01 45
텍스처대역폭줄이기 를참조하십시오. DA-01231-001_v01 46
6.3.8. 텍스처대역폭줄이기 애플리케이션이메모리대역폭에의해제약을받는다는것을알았지만텍스처데이터를가져올때대부분그러하다면다음과같은최적화기법을고려해보십시오. 텍스처의크기를줄입니다. 대상해상도와텍스처좌표를고려합니다. 가장높은밉-레벨을사용자들이사용하기를기대한적이있습니까? 아니라면, 텍스처의크기를줄이는것을고려해보십시오. 이것은과부하된프레임버퍼메모리가강제하여텍스처링이비로컬 (non-local) 메모리에서발생할경우 (AGP 또는 PCI-Express 버스를통한, 시스템메모리와같음 ) 특히유용할수있습니다. NVPerfHUD 메모리그래프는여러힙 (heap) 에드라이버에의해할당된메모리의양을보여주기때문에, 이러한문제를진단하는데도움이될수있습니다. 최소로할수있는모든표면에항상 MIP 매핑을사용합니다. MIP 매핑은텍스처알리아싱 (aliasing) 을줄임으로써더나은이미지품질을실현합니다. 흐릿해보이지않는고품질밉맵을생성하고자할때다양한필터를사용할수있습니다. NVIDIA는포토샷플러그-인, 명령줄유틸리티, 라이브러리와같은최적의밉맵을생성하기위한툴들을제공합니다. 자세한내용은 http://developer.nvidia.com/object/nv_texture_tools.html을참조합니다. MIP 매핑이없으면, 포인트샘플링에한정될수밖에없습니다. 그러면, 바람직하지않은가물거리는효과를초래할수도있습니다. 어떤표면에밉매핑을적용하여그표면이흐릿하게보인다면, 밉맵을비활성화하거나큰음수의 LOD 바이어스를추가하고싶은유혹을피하십시오. 대신비등방성필터링을사용합니다. 모든컬러텍스처를압축합니다. 데칼또는디테일텍스처에사용하는모든텍스처는압축해야하며, 텍스처의알파필요에따라 DXT1, DXT3, DXT5 중하나를사용합니다. 그러면메모리사용량이줄어들뿐만아니라, 텍스처대역폭필요도줄어들고텍스처캐시의효율성도좋아집니다. 꼭필요한것이아니라면비용이많이드는텍스처포맷은피합니다. 64 비트나 128 비트부동소수점포맷과같이대형텍스처포맷은페칭할때확실히훨씬더큰대역폭을필요로합니다. 따라서필요할때에만이포맷을사용합니다. 적당한이방성텍스처필터링수준을사용합니다. 낮은빈도의텍스처와이방성이높은필터링수준을사용하면 GPU 가추가작업을하는데, 시각품질을개선하는데전혀도움이안됩니다. 텍스처대역에의해제한을받는다면, 이방성을가장낮은수준으로유지하십시오. 그러면충분히훌륭한이미지품질을구현할수있습니다. 이상적인애플리케이션에서는텍스처에맞게이방성을설정해야합니다. 꼭필요한것이아니라면삼중선형필터링은해제합니다. 삼중선형필터링 (trilinear filtering) 은별도의텍스처대역폭을소모하지않을때라고해도, 대부분의최신 GPU 아키텍처의경우픽셀쉐이더에서연산할때주기를추가로 DA-01231-001_v01 47
필요로합니다. 밉레벨변이를금방확인할수없는텍스처에서는삼중선형필터링기능을해제하여 fillrate 를절약합니다. 6.3.9. 프레임버퍼대역폭최적화 파이프라인의최종단계인 ROP 는프레임버퍼메모리와직접연결되어있으며, 단일단계로서는프레임버퍼대역폭을가장많이소모합니다. 이때문에, 대역폭이애플리케이션의문제인경우, ROP 로거슬러올라갈때가많습니다. 다음은프레임버퍼대역폭을최적화하는방법입니다. 먼저깊이를렌더링합니다. 이것은앞에나와있듯이픽셀쉐이딩비용을줄여줄뿐만아니라프레임버퍼대역폭비용까지줄여줍니다. 알파블렌딩을줄입니다. 알파블렌딩은프레임버퍼에대해읽기와쓰기를모두필요로합니다. 따라서대역폭을두배소모할가능성이있습니다. 알파블렌딩은그사용을꼭필요한상황으로한정하고, 높은수준으로알파블렌딩을수행한깊이복잡도의경우를주의하십시오. 가능하면깊이쓰기를사용하지않습니다. 깊이쓰기는대역폭을소모하는또다른요소입니다. 따라서파티클 (particle) 과같이알파블렌딩이적용된효과를렌더링할때, 객체를셰도우맵에렌더링할때 ( 사실, 컬러를기반으로한셰도우맵에렌더링하는경우, read 역시비활성화할수있다 ), 그리고다중패스렌더링 ( 최종깊이가이미깊이버퍼에써있음 ) 에서는깊이쓰기를반드시비활성화해야합니다. 불필요한컬러버퍼지우기를피합니다. 모든픽셀이프레임버퍼에서애플리케이션에의해덮어쓰기가보장된다면, 컬러를지우는것을피하도록합니다. 왜냐하면귀중한대역폭을소모하기때문입니다. 그러나, 많은 early-z 최적화가지워진깊이버퍼의결정적컨텐츠에의존하기때문에, 될수있으면매번깊이와스텐실버퍼를지워야합니다. 앞에서뒤로렌더링합니다. 앞에서언급했듯이, 앞에서뒤로렌더링하는것에대한픽셀쉐이딩장점이외에도, 프레임버퍼대역폭의영역에는이와비슷한장점이있습니다. 왜냐하면, early-z 하드웨어최적화가불필요한프레임버퍼읽기및쓰기를버릴수있기때문입니다. 사실, 이러한최적화가없는구식하드웨어라도이방식에서장점을얻을수있을것입니다. 왜냐하면, 더많은픽셀이깊이테스트를통과하지못하여프레임버퍼에컬러와깊이를쓰는회수가줄어들기때문입니다. 스카이박스렌더링을최적화합니다. 스카이박스는프레임버퍼대역폭에의해제약을받을때가많습니다. 그러나어떻게최적화할지결정을해야합니다. 스카이박스를제일나중에렌더링하고깊이 ( 쓰기가아님 ) 를읽은후, 일반적인깊이버퍼링과더불어 early-z 최적화를활성화하여대역폭을줄이는한가지방법이있습니다. 그리고스카이박스를먼저렌더링하고읽기와쓰기를모두비활성화하는방법이있습니다. 이중어떤기법이대역폭을더많이절약할수있느냐하는것은스카이박스중에얼마나최종프레임상에서보이느냐하는것과대상하드웨어에달려있습니다. 스카이박스의상당부분이보이지 DA-01231-001_v01 48
않는다면전자의기법이더나을것이고, 그렇지않다면후자가더많은대역폭을절약할수있을것입니다. 필요할때에만부동소수점프레임버퍼를사용합니다. 이것은더작은정수포맷보다확실히훨씬더큰대역폭을소모합니다. 이는여러개의렌더대상의경우에도마찬가지로적용됩니다. 가능하면 16 비트깊이버퍼를사용합니다. 깊이트랜잭션은많은양의대역폭을소모합니다. 그래서 32 비트대신에 16 비트를사용하는것이훨씬이득이클수있으며, 스케일이작고스텐실이필요없는실내장면에서는 16 비트로도충분한효과를낼때가많습니다. 또한, 동적큐브맵 (dynamic cubemap) 과같이깊이를필요로하는텍스처렌더링의경우 16 비트로도충분할때가많습니다. 가능하면 16 비트컬러를사용합니다. 이것은특히텍스처렌더링효과에해당됩니다. 동적큐브맵과투사된컬러셰도우맵과같이많은경우에 16 비트컬러로충분한효과를보여주기때문입니다. DA-01231-001_v01 49
Chapter 7. 문제해결 여러분의질문과의견을항상기다리고있습니다. 개발자포럼에참여하시거나 NVPerfHUD@nvidia.com 으로이메일을보내주십시오. 7.1. 알려진문제점 NVPerfHUD 는여러대의장치를지원하지않습니다. Direct3DCreate9() 로작성된첫번째장치만을지원합니다. 소프트웨어버텍스처리를사용할때 NVPerfHUD 가충돌할수있습니다. rdtsc 를원시적으로사용하는애플리케이션은 NVPerfHUD 의프레임분석모드에서제대로작동할수없습니다. 해결방법은아래문제해결부분을참조하십시오. 프레임분석모드에서는애플리케이션이 QueryPerformanceCounter() 또는 timegettime() win32 함수를사용하고이에의존할것을요구합니다. 애플리케이션은경과시간 (dt) 계산을강력하게처리해야하며 dt 가영 (0) 일경우에는더욱그러합니다. 다시말해, 프로그램을 dt 로구분하지말아야한다는뜻입니다. 이러한문제가나타나는경우에는 NVPerfHUD 구성대화상자에서 Delta Time 옵션을 SlowMo 로설정해보십시오. 문제가해결되면 dt 가영 (0) 일때상황을처리할수있도록애플리케이션을수정하는것도좋습니다. Index Unit State Inspector 는점및선디스플레이를지원하지않습니다. 애플리케이션이고정된 T&L 을사용할때, State Inspector 는세부정보를표시하지않습니다. 프레임분석모드를사용할때, ( 작동단축키를사용하여 ) NVPerfHUD 를비활성화로설정하고애플리케이션을종료하면 " 종료가 0 이아닐때레퍼런스수 " 를나타내는경고메시지가표시됩니다. NVPerfHUD 가활성화되어있는경우에는닫기버튼을클릭해도창모드에서실행되는애플리케이션이종료되지않을수있습니다. DA-01231-001_v01 50
7.2. 질문및대답 (FAQ) 내애플리케이션에서 NVPerfHUD 분석을사용할수없다는메시지가 NVPerfHUD 에표시됩니다. 승인받지않은제 3 자가사용자의애플리케이션을허가없이분석하지않도록하려면, 대칭수정을통해 NVPerfHUD 분석을활성화해야합니다. 자세한내용은이사용설명서의시작하기부분을참조하십시오. NVPerfHUD 가활성화되어있을때내애플리케이션이응답하지않습니다. 단축키로 NVPerfHUD 를활성화해둔경우에는모든키보드입력이무시되며어떠한키스트로크이벤트도애플리케이션에전달되지않습니다. 선택한작동단축키로이모드를켜거나끌수있습니다. NVPerfHUD 헤더가화면상단에표시되어있지만작동단축키에응답하지않습니다. NVPerfHUD 는키스트로크이벤트를가로채는몇가지방법을사용합니다. 현재지원하지않는방법을사용하고계신경우에는 NVPerfHUD 를업데이트할수있도록저희에게알려주십시오. Win2K NVPerfHUD 에서는작동단축키에귀를기울이고, 활성화상태에서키보드명령을가로채도록 DirectInput 을사용한다는점을잊지마십시오. DirectInput 은 ' 버퍼링된데이터와 ' 및 ' 즉각데이터 ' 등두가지데이터종류를제공합니다. 버퍼링된데이터는애플리케이션에서검색할때가지저장되어있는이벤트기록입니다. 즉각데이터는장치의현재상태에대한스냅샷입니다. 이는병목확인실험, 쉐이더시각화등과같은 NVPerfHUD 의고급기능을사용할때, IDirectInputDevice8::GetDeviceState 인터페이스가아닌 IDirectInputDevice8::GetDeviceData 인터페이스를사용할필요가있다는것을나타냅니다. NVPerfHUD 가알파및일부렌더링상태에영향을미칩니다. NVPerfHUD 는프레임마지막에 HUD 를렌더링합니다. 그뿐아니라, 그리기자체에서렌더링상태를변경하지만원래상태로이를복원하지는않습니다. 다시말해, 성능상의이유로렌더링상태를압박하거나급하게처리하지않는다는뜻입니다. 그렇기때문에, 각프레임시작부분에서애플리케이션이렌더링상태를리셋하는것처럼가정합니다. GPU_IDLE ( 녹색 ) 라인이어떤데이터도보고하지않습니다. GeForce4 (NV25) 및기존 GPU 에서는이정보를사용할수없습니다. NVPerfHUD 가디스플레이드라이버와제대로통신할수없는경우에는새 GPU 에서도이문제가나타날수있습니다. 최신 NVPerfHUD 버전및최신 NVIDIA 디스플레이드라이버를사용하고있는지확인하십시오. DA-01231-001_v01 51
성능그래프의컬러라인이표시되지않거나모두영 (0) 이지만 NVPerfHUD 헤더및배치히스토그램은작동합니다. DirectX 9 DEBUG 런타임을사용할때에는이기능을활성화할수없습니다. 정확한성능분석을위해, DirectX 제어판에서 DEBUG 런타임을 RETAIL 런타임으로전환하십시오. 애플리케이션의함수문제를확인하기위해, NVPerfHUD 디버그콘솔모드만을사용하는경우에는 DEBUG 런타임을사용해도상관없습니다. 내 NVPerfHUD 그래프에불필요한라인이몇개보입니다. ( 특히 Win2K 에서 ) 기존드라이버를사용하는경우에는 NVPerfHUD 그래프위쪽에기존 NVPerfHUD 1.0 그래프가겹쳐나타날수있습니다. 문제를해결하려면, 71.8x 이상으로드라이버를업그레이드하십시오. 프레임분석모드의내장면에서일부객체가계속애니메이션으로나타납니다. 프레임분석모드로전환하면 NVPerfHUD 가애플리케이션의시계를중단시키므로, 정지상태에서현재프레임을상세하게분석할수있습니다. 애플리케이션은 QueryPerformanceCounter() 또는 timegettime() win32 함수를사용하며이에의존해야합니다. 애플리케이션에서 rdtsc 명령을사용하는경우에는프레임분석모드가제대로작동하지않습니다. 프레임기반애니메이션을사용하는애플리케이션에서는애니메이션객체에정지시간이영향을미치지않습니다. 여기수록되지않은문제를발견했습니다. 저희는 NVPerfHUD 가애플리케이션분석을위한유용한도구로개발자들에게꾸준한도움을드리기를원하고있습니다. NVPerfHUD 를사용하면서문제를발견하시거나더나은기능을발견하신경우에는저희에게알려주십시오. NVPerfHUD@nvidia.com DA-01231-001_v01 52
부록 A. 드라이버는왜 GPU 를원하는가 GPU 를완벽하게활용한다는것은프로세서두개를 FIFO 로연결한일반적인상황에서, 처리능력이상의데이터를다룰수있도록한쪽칩이다른쪽을지원하는것입니다. 아래나타난것과같이, CPU 는처리할수있는것보다많은명령으로 GPU 를지원하고있습니다. 이러한현상이나타나면, 모든명령이 "push buffer" 라고도불리우는 FIFO 대기열에서구축되기시작합니다. 이 FIFO 가오버플로우되지않도록하기위해, 드라이버는 FIFO 에새명령을실행할공간이생길때까지대기상태를유지합니다. 100 ms 0 ms 그림 20. GPU 를기다리는드라이버 프레임속도에따른설명 프레임속도가높음이면 CPU 에서더많은작업을할수있으며, 프레임속도 ( 객체컬링, 물리, 로직, 인공지능등...) 에영향을미치지않습니다. 프레임속도가적절하지않음이면, 장면복잡성을줄여 GPU 로드를덜어주어야합니다. DA-01231-001_v01 53
고지 모든 NVIDIA 설계규격, 레퍼런스보드, 파일, 도면, 진단, 목록및기타문서 ( 통칭할때나개별적으로부를때나똑같이 자료 라고함 ) 는 있는그대로 제공됩니다. NVIDIA 는자료와관련하여명시적이든묵시적이든법적이든기타어떠한보증도하지않으며, 무해함, 상품성및특정목적에의적합성에대한모든묵시적인보증을분명하게거부합니다. 제공된정보는정확하고믿을만한것으로간주됩니다. 그러나 NVIDIA Corporation 은그러한정보를사용한결과또는그정보의사용으로야기될수도있는제 3 자의특허또는기타권리의침해에대해서어떠한책임도지지않습니다. NVIDIA Corporation 의특허또는특허권에의거하여함축적이든기타의방법이든어떠한라이센스도제공하지않습니다. 이출판물에수록된사양은예고없이변경될수있습니다. 이출판물은이전에제공된모든정보를대신하고대체합니다. NVIDIA Corporation 제품은 NVIDIA Corporation 의특별서면승인이없이는생명유지장치나시스템의중요한구성요소로사용하는것이금지되어있습니다. 상표 NVIDIA 및 NVIDIA 로고는 NVIDIA Corporation 의등록상표입니다. 기타회사및제품이름은연관된각회사의상표일수있습니다. 저작권 2004, 2005 NVIDIA Corporation. All rights reserved NVIDIA Corporation 2701 San Tomas Expressway Santa Clara, CA 95050 www.nvidia.com