SlideShare une entreprise Scribd logo
1  sur  74
Télécharger pour lire hors ligne
DirectX 12 엔진 개발 Ver 1.5
유영천
Twitter: @dgtman
Blog : http://megayuchi.com
DirectX?
• MS의 Graphics API
• 대응되는 비 Windows계열 API로 OpenGL이 있음.
• 대부분의 Windows 게임과 100%의 XBOX게임이 DirectX를 사
용
• 게임 수로 보면 DX9 >= DX11 >>> DX12
• DirectX 12 == Direct 3D12
• Direct 2D, Direct Write를 포함하지 않음.
• D3D외의 기능은 D3D11 on D3D12를 사용해야한다(느리다;;;;)
• 성능 최우선!
• CPU 성능이 정체되었다.
• 현세대 하드웨어만으로 성능을 향상시킬 수 없을까?
• 멍청한 (AMD GPU)에서 성능을 향상시킬 수 없을까?
DirectX 12?
• 발표자료 – DirectX 12 엔진 개발
• https://doc.co/zeVZ7w
• 포프 tv DX12 관련 라이브
• https://youtu.be/R3nNDrIsXdk
• https://youtu.be/KYubTIaEKCE
예전 DX12관련 자료들 – Windows 10 th2 시절
• 많은 버그 수정.
• DirectX Raytracing지원
• Mesh shader지원
• Direct Storage 지원(예정)
• 다수의 DX11/12 겸용 AAA게임들 출시
• Quantum Break
• Battle Field 1
• Forza Motor sports series
• Forza Horizon series
• 기타 등등…
그 동안의 변화
• Quantum Break – DX11 > DX12
https://www.computerbase.de/2016-09/quantum-break-steam-
benchmark/3/#diagramm-quantum-break-3840-2160-fx-8370
• Battle Field 1 – DX11 >= DX12
http://www.gamestar.de/spiele/battlefield-
1/artikel/battlefield_1_open_beta,53468,3301876.html
• F1 2020 – nvidia DX11 >= DX12 , AMD DX12 >=DX11
https://www.guru3d.com/articles-pages/f1-2020-pc-graphics-performance-
benchmark-review,4.html
DX12성능 – 유명 게임 벤치마크
DX12가 DX11보다 빠르지 않다.
결론부터 얘기하면…
DirectX 9/11
운전 보조 장치가 붙어있는 스포츠카
DirectX 12
F1머신. 드라이버 실력이 받쳐주지 못하면 출발도 못함.
• 암묵적인(implicit) 처리가 많기 때문에 DirectX runtime과 드라
이버에서 최적화시킬 여지도 많음. 실제로 상당한 최적화가 이
루어져있다.
• 지난 십 여년간 GPU회사들이 자사의 드라이버를 엄청나게 최
적화 시켰음.
• Single-Thread로만 렌더링을 해도 GPU점유율 100%에 도달할
수 있는 것은 runtime 최적화와 Driver최적화 덕분.
DirectX 9/11이 스포츠카라고?
DirectX 12에선 이 보조장치들의 지원을 받지 못함.
DirectX 12의 문제점
• 거의 대부분의 내장GPU에선 정상 작동 안함.
• 정상작동 하는듯 해도 한계상황에 가면 크래시하거나 화면이 깨지거나
하는 일이 다반사
• 이론상 DX Feature Level 11을 지원하면 충분하지만 실제로는
nvidia Maxwell이전 세대 GPU에서 크~게 느리거나 정상작동
하지 않는다.
• 코드 양이 적어도 2배 이상 많아진다. 체감 10배.
• 굉장히 신경을 쓰지 않으면 시스템 메모리와 GPU메모리 사용
량이 50%이상 더 소모된다. 상당한 노력을 기울여야 겨우 DX11
엔진보다 조금 덜 먹는 수준까지 맞출수 있다.
그럼에도 DX12를 학습할 이유가 있는가?
• 몰라서 못하는것과 아는데 안하는건 다르다.
• MS가 최신 기능들을 DX12에만 업데이트 해주고 있다. 그들은
결코 실패를 인정하지 않는다.
• 따라서 상용엔진의 어플리케이션 레이어만 다룰것이 아니라면,
좋은 싫든 하기는 해야 한다.
• 모바일 그래픽 API도 사실상 iOS-Metal, Android-Vulkan이 강
제되고 있다. 개발환경(특히 디버깅)은 MS 플랫폼이 가장 편리
하므로 차세대 API(Metal/Vulkan )로 이행하기 위해선 DX12로
시작하는 편이 적응하기 쉽다.
DirectX 12 Programming
• CPU ->Draw Call -> GPU 처리의 과정을 줄임.
• 완전한 비동기 렌더링
• 각종 State들을 한방에 처리 ->
• OMSet…RSSet…PSSet…VSSet… -> ID3D12PipenlineState 한 개로.
• DirectX runtime과 드라이버에서 해주던 일들을 Application 레
이어로 빼냄.(이 때문에 드라이버에서 최적화를 못해준다.)
성능향상을 위한 DX11 -> DX12 변화(빨라지지도 않았지만)
• Resource Binding ->Root Signature / Descriptor Table
• Immediate Context -> Command List & Command Queue
• State변경 -> ID3D12PipelineState
• Shader 코드는 그대로 사용 가능.
• D3DX? 텍스쳐 파일 로딩함수도 직접 만들어야함. 다만 이제는
DirectXTex가 D3D12도 지원한다.
• 자동으로 이루어졌던 Resource Transition은 ResourceBarrier를
사용해서 직접 처리해야한다.
• Dynamic Resource Renaming? 그딴거 없다.
API의 변화
Resource Binding
DX9/11 –> DX12로 포팅작업을 한다면 가장 많
은 시간을 들이게 될…(대부분 여기서 포기한다
는데 500원 건다)
• Vertex Buffer
• Index Buffer
• Texture
• Constant Buffer
• Unorderd Acceess Buffer (for Compute Shader)
• Sampler
렌더링을 위해 이러한 Resource들을 Graphics Pipeline에 bind한다.
Resource Binding
• RTV로 사용된 리소스는 SRV로 사용하기 전에 Transition되어야
함.
• SRV로 지정된 리소스는 RTV로 사용하기 전에 Transition되어야
함.
• DX11에선 자동 + implicit 이었으나 DX12에선 수동 + explicit
으로 처리한다.
Resource Barrier
pCommandList->ResourceBarrier(1,
&CD3DX12_RESOURCE_BARRIER::Transition(m_pRenderTargetDiffuse,
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
D3D12_RESOURCE_STATE_RENDER_TARGET));
pCommandList->ResourceBarrier(1,
&CD3DX12_RESOURCE_BARRIER:: Transition(m_pRenderTargetDiffuse,
D3D12_RESOURCE_STATE_RENDER_TARGET,
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));
• Resource의 정보를 기술한 메모리 블록
• CBV,SRV,UAV를 생성하면 그 결과로 이 Descriptor를 얻는다.
• 32-64bytes 사이즈.(GPU마다 다름.)
• 객체가 아니다. 해제할 필요 없다.
• 내부적으로 GPU Memory, CPU Memory pair로 구성됨.
• D3D12_GPU_DESCRIPTOR_HANDLE,
D3D12_CPU_DESCRIPTOR_HANDLE로 표현되며 사실상 포인터.
Descriptor
• Descriptor로 사용할 선형 Memory배열
• ID3D12DescriptorHeap로 구현되어 있다.
• CPU측 메모리, GPU측 메모리 pair로 구성되어있다.
• CBV/SRV/UAV는 이 Descriptor Heap의 CPU/GPU 메모리에 생
성(write)된다.
• Descriptor Heap의 CPU측 메모리에 write, Shader에선 GPU메
모리에서 read한다.
Descriptor Heap
• 어떤(Texture, Constant Buffer, Sampler등) Resource가 어떻게
Pipeline에 bind 될지를 정의
• Resource binding 설정을 기술한 일종의 템플릿이다.
Root Signature – ID3D12RootSignature
• Descriptor의 논리적 배열
• Descriptor Heap의 임의의 위치가 Descriptor Table에 맵핑된다.
Descriptor Table
소스코드 설명
• CreateTextureFromFile
• ShadowMap Resource Barrier
• CVLMeshObject, RootSignature
• Draw SetDescriptorTable
TR Matrix Bones Matrix Light Cube Shadow Map
material diffuse mask toon
pCommandList->SetGraphicsRootDescriptorTable(0, gpuHeap);
pCommandList->SetGraphicsRootDescriptorTable(1, gpuHeap);
FaceGroup 0
material diffuse mask toon
pCommandList->SetGraphicsRootDescriptorTable(1, gpuHeap);
FaceGroup 1
material diffuse mask toon
pCommandList->SetGraphicsRootDescriptorTable(1, gpuHeap);
FaceGroup 2
CD3DX12_DESCRIPTOR_RANGE rangesPerObj[3];
rangesPerObj[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 2, 0);// b0 : default , b1 : bones
rangesPerObj[1].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 5);// b5 : Light Cube
rangesPerObj[2].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 3);// t3 : shadow
CD3DX12_DESCRIPTOR_RANGE rangesPerFacegroup[2];
rangesPerFacegroup[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 2);// b2 : material
rangesPerFacegroup[1].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 3, 0);// t0 : diffuse , t1 : mask , t2 : toon ta
ble
CD3DX12_ROOT_PARAMETER rootParameters[2];
rootParameters[0].InitAsDescriptorTable(_countof(rangesPerObj), rangesPerObj, D3D12_SHADER_VISIBILITY_ALL);
rootParameters[1].InitAsDescriptorTable(_countof(rangesPerFacegroup), rangesPerFacegroup, D3D12_SHADER_VISIB
ILITY_ALL);
TR Matrix Bones Matrix Light Cube Shadow Map material diffuse mask
b0 b1 b5e t3 b2 t0 t1
toon
t2
0 1 2 3 4 5 6 7
Shader Register
Descriptor Table
Descriptor Heap
Root Parameter 0 Root Parameter 1
TR Matrix Bones Matrix Light Cube Shadow Map material diffuse mask toon
Descriptor Heap
material diffuse mask toon material diffuse mask toon
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
필요 Descriptor개수 : 16개
D3D12_GPU_DESCRIPTOR_HANDLE gpuHeap = pDescriptorHeap->GetGPUDescriptorHandleForHeapStart();
pCommandList->IASetVertexBuffer(…);
pCommandList->SetGraphicsRootDescriptorTable(0, gpuHeap);
for (i=0; i<3; i++)
{
pCommandList->SetGraphicsRootDescriptorTable(1, gpuHeap);
pCommandList->IASetIndexBuffer(…);
pCommandList->DrawIndexedInstanced(…);
gpuHeap.Offset(4, DescriptorSize);
}
Object Face Group 0 Face Group 1 Face Group 2
Command List & Command Queue
• 비동기 렌더링을 위한 디자인
• DX11의 Immediate Context는 더 이상 존재하지 않는다.
• Graphics Command를 Command List 에 Recording해서
• Command Queue에 전송. ( 이 시점에 GPU Queue로 전송)
• 1개의 Command List만으로도 처리는 가능. -> 성능 안나옴
• 멀티스레드로 여러 개의 Command List를 동시에 recording하
고 각각의 스레드가 독립적으로 Execute하는 것을 권장.
Command Queue – 작업 완료전까지 리
소스 유지
• Command Queue에 전송했다고 하는 것이 렌더링 작업의 완료
를 뜻하는 것이 아니다.
• Command Queue에 제출한 작업이 완료되기 전에해당 작업에
서 참조하는 D3D리소스들이 해제되어서는 안된다.
Command Queue – 완료 체크
• ID3D12Fence객체를 사용해서 작업이 완료되었는지를 표시한다.
• ID3D12CommandQueue::Signal(fence, completed value)를 호
출, 전송한 작업이 완료되면 ID3D12Fence객체의 Completed
value가 업데이트된다.
• ID3D12Fence::GetCompletedValue()로 작업이 완료되었는지를
체크.
Command List 0
Clear RTV
SetRTV
SetPSO
Draw
Command Queue
Command List 1
Clear RTV
SetRTV
SetPSO
Draw
Clear RTV
SetRTV
SetPSO
Draw
Clear RTV
SetRTV
SetPSO
Draw
Execute()
Execute()
Thread 1
Thread 0
GPU Hardware queue
Command Queue
• Blend State
• Depth State
• Render Target format
• Shaders…
이 모든 상태들을 하나로 묶어서 처리.
Shader 하나, Blend상태 하나 바꾸려고 해도 ID3D12PipelineState를 통째로 바꿔야함.
Shader 폭발에 이은 Pipeline State 폭발!
Pipeline State – ID3D12PipelineState
Pipeline State폭발의 슬픈 예
• 5차원, 6차원, 7차원 ..N차원 배열을 쓰던가…
• MS에서 권장하는 방법은 PipelineState cache를 만들어서 사용
하라는 것.
• 다양한 렌더링 옵션을 설정하는 상황을 아예 피하게 됨. -> 결
과적으로 툴에서 사용할 API로는 DX12보다 DX11을 선호하게
되낟.
DX12로 기본적인 렌더링을 하기 위
한 지식은 이 정도로…
Debugging
• 비동기 렌더링 특성상 API에 잘못된 파라미터를 전달해도 그 즉
시 알기 어려움.
• 꼭 버그를 잡기 위함이 아니라 작동원리를 알기 위해서라도 디
버거로 추적해볼 필요가 있다.
• Windows 10 Anniversary Update 이후로 DX런타임이나 GPU
드라이버의 버그는 거의 없는것 같다.
• DX런타임 또는 드라이버의 버그로 보이더라도 내가 뭘 잘못했
는지 먼저 체크하라.
Debugging
• 전달된 파라미터의 유효성, Resource Barrier의 상태 등등 프로
그래머의 실수를 미리 잡아준다.
• 에러가 아닌데 에러라고 판별할 가능성은 거의 없다. 반드시 무
시하지 말고 체크할 것.
ID3D12Debug*pDebugController = NULL;
// Enable the D3D12 debug layer.
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pDebugController))))
{
pDebugController->EnableDebugLayer();
}
D3D12 Debug Layer의 사용
exe파일명을 등록시켜 놓으면 해당 app에서 Error나 Warning
발생시 브레이크를 걸 수 있다.
DirectX Control Panel
• 프레임을 캡쳐해서 렌더링 과정을 보여줌.
• Pipeline에 바인드된 D3DResoruce를 추적할 수 있다.
• Descriptor Table에 내용을 볼 수 있는 것이 큰 장점.
• 딱 잘라 말하건데 이 툴 없이는 개발 불가능.
• ALT+F5로 디버거 작동.
• ID3D12Object::SetName()으로 이름을 지정해놓으면 그래픽스
디버깅할때 해당 Draw Call을 찾기 쉽다. 이름 가지고 검색도 됨
*_*
Visual Studio Graphics Debugger
Shadow map 생성 과정을 디버깅 하는 예 ( https://goo.gl/nC5f80 참고 )
Shadow map 생성 과정을 디버깅 하는 예 ( https://goo.gl/nC5f80 참고 )
DX11 Graphics Debugger
DX12 Graphics Debugger
• DX11의 Immediate Context에선 한번 설정한 state가 변경하기
전까지 계속 유지됨.
• DX12에선 CommandQueue에 기본 설정된 RTV, DSV, Viewport
없음.
• DX12에선 Command List를 사용할 때마다 RTV, DSV, Viewport
를 설정할 필요가 있음.
• OMSetRenderTarget(), RSSetViewport등은 커맨드 초반에 먼저
호출해줄것.
• Fence ->Wait-> Complete 될 때까지 리소스 상태를 유지할것.
자주 하는 실수
Optimization
• 수동으로 GPU H/W Queue를 꽉 채워넣기가 어려움. DX11에선
런타임과 드라이버가 자동으로 해줌.
• DX12에선 GPU점유율이 떨어지면 클럭이 낮아짐.
• 클럭이 떨어지니 처리속도도 덩달아 느려짐.
• GPU가 펑펑 노는게(GPU점유율이 낮게 나옴) 근본적인 문제.
힘들게 포팅했는데 D3D11보다 느리네…
• 64KB Align
• 한개짜리 Vertex Buffer를 할당해도 최소 64KB
• 한개짜리 Index Buffer를 할당해도 최소 64KB
• 4Bytes 짜리 Constant Buffer를 할당해도 최소 64KB.
• Buffer -> CBV로 사용할땐 256KB Align 필요
• Bulk Memory로 할당해서 쪼개 사용할 것.
메모리는 왜 이리 많이 먹어?
• Windows ADK의 Performance Toolkit에 포함된 로그 분석기
1. ADK설치
2. Admin권한으로 CMD을 열고
• C:Program Files (x86)Windows Kits10Windows Performance
Toolkitgpuview 폴더로 이동
• >Log.cmd 로 logging시작
• 다시 Log.cmd를 입력해서 logging종료
• Merged.etl파일을 GPUView에서 로드
GPUView
GPUView로 보는 D3D11 vs D3D12
• Single-Thread Rendering
• 신경 쓴 것이라곤 GPU Memory에 최대한 올려놓고 안건드렸을
뿐 (렌더링중 Map(), Unmap()을 피한다.)
• 심지어 D3DResource를 렌더링 중에 마구 변경해가며 재활용하
고 있다. -> DX11은 Resource Renaming으로 이 문제를 해결한
다
• 그럼에도 불구하고 DX11은 GPU Queue를 꽉꽉 채우며 최대한
의 성능을 내주고 있다.
DirectX 11 , 과연 안정적인 스포츠카!!!
• CPU -> Draw Call -> GPU까지의 과정이 짧아진건 명백한 사실.
• 이 부분에선 확실히 성능향상이 있다.
• Command List 작성과 Execute의 적절한 배분.
• 하나의 Command List에 몰아서 Command를 기록하고 마지막에
Execute 한번만 하면? -> GPU가 펑펑 놀다가 마지막에 한번에 과부하
를 받게 된다.
• 여러 개의 Command List를 사용해서 Command기록과 Execute를 동
시에 처리해야할 필요가 있다.
• Command List 작성과 Execute의 비동기 처리를 극대화하기 위
해 Multi-Thread Rendering이 필요하다.
최적화할 수 있는 포인트는 뭐가 있을까?
From “Direct3D 12 API Preview” in Build 2014
D3D12 runtime의 CPU처리가 훨씬 짧다.
• 따라서 비슷한 정도의 GPU점유율이라면 D3D12 엔진이 더 빠
를 것이다.
• GPU H/W Queue를 최대한 꽉 채우는 것이 성능 향상의 열쇠.
D3D12 runtime의 CPU처리가 훨씬 짧다.
• Execute()를 해야만 GPU H/W Queue로 Command전송
• D3D12엔진의 초기버전에선 Execute()를 present()직전에 한번
만 호출했었다.
• 그래서 Present 직전까지 GPU가 그냥 놀았다-_-;;;;;
• 인간 ABS(from initial D)라고 들어보았는가?
• 마치 브레이크를 조밀하고 다다다다다 밟는 것처럼, 게임 루프
중간에서 수동으로 자주자주 커맨드 리스트를 전송해야한다.
Execute호출 빈도 조절
• 여러 개의 Command List를 미리 할당해 둔다.
• Command List 하나당 N개의 오브젝트 렌더링에 대한
Command를 기록.
• N개에 도달하면 Execute(), 다음번 Command List에 계속해서
렌더링 Command 기록.
• 모든 오브젝트를 다 렌더링하거나 할당해 둔 Command List를
다 사용할 때까지 반복.
Command List Pooling
• 성능이 상당히 개선되었다.
• 그러나 아직도 부족하다.
Command List Pooling
• Multi-Thread로 Command 작성 시간을 최소화시킨다.
• 단순계산으로 n이란 시간이 걸린다면 4 thread를 사용하면 시
간을 n/4로 줄일 수 있다.
• GPU Queue가 empty 되지 않도록 최선을 다한다.
Multi-Thread Rendering
From “Approaching Minimum Overhead with Direct3D12” NVIDIA
D3D12에서의 Multi-Thread Rendering
• 스레드 1개당 Command List하나씩 배당
• 엔진 내의 Queue에 담긴 오브젝트들을 각 스레드에 균등하게
배분
• 각 스레드는 자신의 Command List에 오브젝트들의 렌더링
Command를 기록
• 마지막 오브젝트까지 처리하고 난 후 Execute()
Multi-Thread Rendering 구현
Thread 0
Command List
Obj 0
Obj 1
Obj 23
Obj 24
.
.
.
Thread 1
Command List
Obj 25
Obj 26
Obj 48
Obj 49
.
.
.
Thread 2
Command List
Obj 50
Obj 51
Obj 73
Obj 74
.
.
.
Thread 3
Command List
Obj 75
Obj 76
Obj 98
Obj 99
.
.
.
Command Queue
Execute() Execute() Execute() Execute()
Multi-Thread Rendering 구현
Present
DX12 - 1 Thread Present
Present
DX12 4 Threads Present
Present
DX11 Single Thread Present
• CPU작업을 줄이고 되도록 GPU에 부담시킨다.
• 멀티스레드 렌더링은 필수
• Execute()를 자주 호출하되, 너무 자주 호출하지 않는다(?)
• 하나의 Command List에 너무 많이 몰아서 Execute()하지 않는
다.
• 되도록 Wait 하지않는다.
• 가능하다면 서로 대기할 필요가 없는 작업들은 여러 개의
Command Queue로 나눠서 Execute한다. Ex) 머리카락 흔들림
을 , 구름처리등은 Compute Shader로 비동기적으로 처리
• Resource는 Bulk Memory로 할당하고 그 안에서 쪼개서 사용한
다.
최적화 가이드
성능 비교
Res. 3000x2000 D3D11 D3D12
10 Characters 25 fps 33 fps D3D12 , +32%
100 Characters 18 fps 20 fps D3D12 , +11%
성능비교 Project D Online
@Surface Book i5 nvidia dGPU
장비 성능이 떨어질수록(특히
GPU성능이 낮을수록) DX12가
빠를 가능성이 높다.
Res. 3000x2000 D3D11 D3D12
1 Character + Voxels 28 fps 37 fps D3D12 , +32%
성능비교 – Voxel Horizon
@Surface Book i5 nvidia dGPU
장비 성능이 떨어질수록(특히
GPU성능이 낮을수록) DX12이
빠를 가능성이 높다.
Res. 1920x1200 D3D11 D3D12
10 Characters 509 fps 327 fps D3D11 , +55%
100 Characters 171 fps 107 fps D3D11 , +60%
성능비교 Project D Online
@Desktop i7 2600K nvidia GTX970 - 1 Thread
장비 성능이 좋으면 좋을수록
(특히 GPU성능이 좋을수록)
DX11이 빠르다.
Res. 1920x1200 D3D11 D3D12
1 Character + Voxels 478 fps 297 fps D3D11 , +61%
성능비교 – Voxel Horizon
@Desktop i7 2600K nvidia GTX970
장비 성능이 좋으면 좋을수록
(특히 GPU성능이 좋을수록)
DX11이 빠르다.
Res. 1920x1200 D3D12 - 4 Thread D3D12 – 1 Thread
10 Characters 327 fps 227 fps 4 Threads , +44%
100 Characters 107 fps 42 fps 4 Threads , +155%
Thread 개수에 따른 성능비교 - Project D Online
@Desktop i7 2600K nvidia GTX970 Multi-Threads렌더링은 선택이 아닌 필수!!!!
Present Present
DX12 4 Threads – 107fps
Present Present
DX12 1 Threads – 42fps
• D3D12로 포팅만 하면 11보다 빠를거라고 생각하면 큰 착각.
• Async Compute Shader를 사용할 수 있지만 큰 성능 향상은 기
대하지 말것.
• GPU 점유율을 어떻게 높이는가, 즉 GPU 큐에 얼마나 작업을 꽉
꽉 채워넣는가가 성능의 열쇠.
• 잘~ 짜면 빨라지긴 빨라진다. 그래도 어지간해선 DX11보다 빠
르진 않다.
• DirectX Runtime, Driver로 인한 성능 향상은 꿈꾸지 말것.
결론
FAQ
• Direct Write와 Direct2D를 쓰고 싶어요.
• D3D11 on D3D12를 사용하세요.
• D3D12 API는 Thread-safe한가요?
• 네. Thread-safe합니다. 별도의 lock을 걸어줄 필요가 없습니다.
• 개발자가 능력이 없어서 DX12버전의 성능이 안나오는것 아닌
가요?
• Balttle Field 1, Quantum Break의 벤치마크를 참고해주세요.
• 단지 DX12에 문제가 있어서 성능이 떨어지는게 아닐까요?
Vulkan을 쓰면 DX11보다 빠르지 않을까요?
• DX12와 Vulkan의 성능 차이는 거의 없습니다.
FAQ
• A사 그래픽 카드에선 DX12가 DX11보다 빠르던데?
• DX12가 빠른게 아니고 A사 그래픽 카드에서 DX11이 느린겁니다. 드라
이버 성능이 N사보다 떨어져서 그렇습니다. DX11에선 그래픽 드라이
버에서 성능을 올려줄 수 있는 여지가 많습니다.
Reference
• D3D tag ,megayuchi.com
• https://microsoft.github.io/DirectX-
Specs/d3d/CPUEfficiency.html
• Approaching Minimum Overhead with Direct3D12
• Direct3D 12 API Preview
• Efficient Rendering with DirectX 12 on Intel Graphics
• DIRECTX ADVANCEMENTS IN THE MANY CORE ERA Getting t
he most out of the PC Platform
• Using GPUView to Understand your DirectX 11 Game
Reference - Dynamic Buffer사용
• https://megayuchi.com/2016/02/01/d3d12%EC%97%94%EC%
A7%84-%EA%B0%9C%EB%B0%9C-dynamic-vertexbuffer-
%EC%82%AC%EC%9A%A9/
• https://microsoft.github.io/DirectX-
Specs/d3d/CPUEfficiency.html
• https://docs.microsoft.com/ko-
kr/windows/win32/direct3d12/upload-and-readback-of-
texture-data
• https://software.intel.com/content/www/us/en/develop/article
s/tutorial-migrating-your-apps-to-directx-12-part-3.html

Contenu connexe

Tendances

Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14AMD Developer Central
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술Ki Hyunwoo
 
게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPU게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPUYEONG-CHEON YOU
 
Compute shader
Compute shaderCompute shader
Compute shaderQooJuice
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희changehee lee
 
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Johan Andersson
 
Screen space reflection
Screen space reflectionScreen space reflection
Screen space reflectionBongseok Cho
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingYEONG-CHEON YOU
 
Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Graham Wihlidal
 
Direct x 11 입문
Direct x 11 입문Direct x 11 입문
Direct x 11 입문Jin Woo Lee
 
Shadow mapping 정리
Shadow mapping 정리Shadow mapping 정리
Shadow mapping 정리changehee lee
 
191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering191019 Forward / Deferred Rendering
191019 Forward / Deferred RenderingKWANGIL KIM
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11민웅 이
 
Cascade Shadow Mapping
Cascade Shadow MappingCascade Shadow Mapping
Cascade Shadow MappingSukwoo Lee
 
08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드noerror
 
Graphics Gems from CryENGINE 3 (Siggraph 2013)
Graphics Gems from CryENGINE 3 (Siggraph 2013)Graphics Gems from CryENGINE 3 (Siggraph 2013)
Graphics Gems from CryENGINE 3 (Siggraph 2013)Tiago Sousa
 

Tendances (20)

Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
 
게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPU게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPU
 
Compute shader
Compute shaderCompute shader
Compute shader
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희
 
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
 
Screen space reflection
Screen space reflectionScreen space reflection
Screen space reflection
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion Culling
 
Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016
 
Direct x 11 입문
Direct x 11 입문Direct x 11 입문
Direct x 11 입문
 
Light prepass
Light prepassLight prepass
Light prepass
 
Shadow mapping 정리
Shadow mapping 정리Shadow mapping 정리
Shadow mapping 정리
 
191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11
 
Ssao
SsaoSsao
Ssao
 
Cascade Shadow Mapping
Cascade Shadow MappingCascade Shadow Mapping
Cascade Shadow Mapping
 
Bump Mapping
Bump MappingBump Mapping
Bump Mapping
 
Motion blur
Motion blurMotion blur
Motion blur
 
08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드
 
Graphics Gems from CryENGINE 3 (Siggraph 2013)
Graphics Gems from CryENGINE 3 (Siggraph 2013)Graphics Gems from CryENGINE 3 (Siggraph 2013)
Graphics Gems from CryENGINE 3 (Siggraph 2013)
 

Similaire à Introduction to DirectX 12 Programming , Ver 1.5

Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2YEONG-CHEON YOU
 
Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Samsung Electronics
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기진현 조
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9진현 조
 
C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)지환 김
 
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013devCAT Studio, NEXON
 
Direct3d overview
Direct3d overviewDirect3d overview
Direct3d overview문익 장
 
프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer ModelHan Lee
 
[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp진현 조
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)khuhacker
 
DirectStroage프로그래밍소개
DirectStroage프로그래밍소개DirectStroage프로그래밍소개
DirectStroage프로그래밍소개YEONG-CHEON YOU
 
KGC 2007 소프트웨어 렌더러 개발
KGC 2007  소프트웨어 렌더러 개발KGC 2007  소프트웨어 렌더러 개발
KGC 2007 소프트웨어 렌더러 개발SeongWan Kim
 
Quick & Dirty Tips for x64 hooks
Quick & Dirty Tips for x64 hooksQuick & Dirty Tips for x64 hooks
Quick & Dirty Tips for x64 hooks용환 노
 
[0602 박민근] direct2 d
[0602 박민근] direct2 d[0602 박민근] direct2 d
[0602 박민근] direct2 dMinGeun Park
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계Leonardo YongUk Kim
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기Chang W. Doh
 
Cocos2d x a to z (상)
Cocos2d x a to z (상)Cocos2d x a to z (상)
Cocos2d x a to z (상)SeungIl Choi
 
Ndc12 이창희 render_pipeline
Ndc12 이창희 render_pipelineNdc12 이창희 render_pipeline
Ndc12 이창희 render_pipelinechangehee lee
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018Shengzhe Li
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012devCAT Studio, NEXON
 

Similaire à Introduction to DirectX 12 Programming , Ver 1.5 (20)

Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2
 
Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
 
C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)
 
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
 
Direct3d overview
Direct3d overviewDirect3d overview
Direct3d overview
 
프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model
 
[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
 
DirectStroage프로그래밍소개
DirectStroage프로그래밍소개DirectStroage프로그래밍소개
DirectStroage프로그래밍소개
 
KGC 2007 소프트웨어 렌더러 개발
KGC 2007  소프트웨어 렌더러 개발KGC 2007  소프트웨어 렌더러 개발
KGC 2007 소프트웨어 렌더러 개발
 
Quick & Dirty Tips for x64 hooks
Quick & Dirty Tips for x64 hooksQuick & Dirty Tips for x64 hooks
Quick & Dirty Tips for x64 hooks
 
[0602 박민근] direct2 d
[0602 박민근] direct2 d[0602 박민근] direct2 d
[0602 박민근] direct2 d
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
 
Cocos2d x a to z (상)
Cocos2d x a to z (상)Cocos2d x a to z (상)
Cocos2d x a to z (상)
 
Ndc12 이창희 render_pipeline
Ndc12 이창희 render_pipelineNdc12 이창희 render_pipeline
Ndc12 이창희 render_pipeline
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
 

Plus de YEONG-CHEON YOU

CUDA Raytracing을 이용한 Voxel오브젝트 가시성 테스트
CUDA Raytracing을 이용한 Voxel오브젝트 가시성 테스트CUDA Raytracing을 이용한 Voxel오브젝트 가시성 테스트
CUDA Raytracing을 이용한 Voxel오브젝트 가시성 테스트YEONG-CHEON YOU
 
Visual Studio를 이용한 어셈블리어 학습 part 2
Visual Studio를 이용한 어셈블리어 학습 part 2Visual Studio를 이용한 어셈블리어 학습 part 2
Visual Studio를 이용한 어셈블리어 학습 part 2YEONG-CHEON YOU
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1YEONG-CHEON YOU
 
XDK없이 XBOX게임 개발하기(UWP on XBOX)
XDK없이 XBOX게임 개발하기(UWP on XBOX)XDK없이 XBOX게임 개발하기(UWP on XBOX)
XDK없이 XBOX게임 개발하기(UWP on XBOX)YEONG-CHEON YOU
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현YEONG-CHEON YOU
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술YEONG-CHEON YOU
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략YEONG-CHEON YOU
 
Voxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseVoxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseYEONG-CHEON YOU
 
CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기YEONG-CHEON YOU
 
서버와 클라이언트 같은 엔진 사용하기
서버와 클라이언트 같은 엔진 사용하기서버와 클라이언트 같은 엔진 사용하기
서버와 클라이언트 같은 엔진 사용하기YEONG-CHEON YOU
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법YEONG-CHEON YOU
 
win32 app에서 UWP API호출하기
win32 app에서 UWP API호출하기win32 app에서 UWP API호출하기
win32 app에서 UWP API호출하기YEONG-CHEON YOU
 
Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기YEONG-CHEON YOU
 
Development AR App with C++ and Windows Holographic API
Development AR App with C++ and Windows Holographic APIDevelopment AR App with C++ and Windows Holographic API
Development AR App with C++ and Windows Holographic APIYEONG-CHEON YOU
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)YEONG-CHEON YOU
 
Implements Cascaded Shadow Maps with using Texture Array
Implements Cascaded Shadow Maps with using Texture ArrayImplements Cascaded Shadow Maps with using Texture Array
Implements Cascaded Shadow Maps with using Texture ArrayYEONG-CHEON YOU
 
Porting direct x 11 desktop game to uwp app
Porting direct x 11 desktop game to uwp appPorting direct x 11 desktop game to uwp app
Porting direct x 11 desktop game to uwp appYEONG-CHEON YOU
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~YEONG-CHEON YOU
 

Plus de YEONG-CHEON YOU (20)

CUDA Raytracing을 이용한 Voxel오브젝트 가시성 테스트
CUDA Raytracing을 이용한 Voxel오브젝트 가시성 테스트CUDA Raytracing을 이용한 Voxel오브젝트 가시성 테스트
CUDA Raytracing을 이용한 Voxel오브젝트 가시성 테스트
 
Visual Studio를 이용한 어셈블리어 학습 part 2
Visual Studio를 이용한 어셈블리어 학습 part 2Visual Studio를 이용한 어셈블리어 학습 part 2
Visual Studio를 이용한 어셈블리어 학습 part 2
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1
 
XDK없이 XBOX게임 개발하기(UWP on XBOX)
XDK없이 XBOX게임 개발하기(UWP on XBOX)XDK없이 XBOX게임 개발하기(UWP on XBOX)
XDK없이 XBOX게임 개발하기(UWP on XBOX)
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
Voxelizaition with GPU
Voxelizaition with GPUVoxelizaition with GPU
Voxelizaition with GPU
 
Voxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseVoxel based game_optimazation_relelase
Voxel based game_optimazation_relelase
 
Sw occlusion culling
Sw occlusion cullingSw occlusion culling
Sw occlusion culling
 
CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기
 
서버와 클라이언트 같은 엔진 사용하기
서버와 클라이언트 같은 엔진 사용하기서버와 클라이언트 같은 엔진 사용하기
서버와 클라이언트 같은 엔진 사용하기
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
 
win32 app에서 UWP API호출하기
win32 app에서 UWP API호출하기win32 app에서 UWP API호출하기
win32 app에서 UWP API호출하기
 
Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기
 
Development AR App with C++ and Windows Holographic API
Development AR App with C++ and Windows Holographic APIDevelopment AR App with C++ and Windows Holographic API
Development AR App with C++ and Windows Holographic API
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
Implements Cascaded Shadow Maps with using Texture Array
Implements Cascaded Shadow Maps with using Texture ArrayImplements Cascaded Shadow Maps with using Texture Array
Implements Cascaded Shadow Maps with using Texture Array
 
Porting direct x 11 desktop game to uwp app
Porting direct x 11 desktop game to uwp appPorting direct x 11 desktop game to uwp app
Porting direct x 11 desktop game to uwp app
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
 

Introduction to DirectX 12 Programming , Ver 1.5

  • 1. DirectX 12 엔진 개발 Ver 1.5 유영천 Twitter: @dgtman Blog : http://megayuchi.com
  • 2. DirectX? • MS의 Graphics API • 대응되는 비 Windows계열 API로 OpenGL이 있음. • 대부분의 Windows 게임과 100%의 XBOX게임이 DirectX를 사 용 • 게임 수로 보면 DX9 >= DX11 >>> DX12
  • 3. • DirectX 12 == Direct 3D12 • Direct 2D, Direct Write를 포함하지 않음. • D3D외의 기능은 D3D11 on D3D12를 사용해야한다(느리다;;;;) • 성능 최우선! • CPU 성능이 정체되었다. • 현세대 하드웨어만으로 성능을 향상시킬 수 없을까? • 멍청한 (AMD GPU)에서 성능을 향상시킬 수 없을까? DirectX 12?
  • 4. • 발표자료 – DirectX 12 엔진 개발 • https://doc.co/zeVZ7w • 포프 tv DX12 관련 라이브 • https://youtu.be/R3nNDrIsXdk • https://youtu.be/KYubTIaEKCE 예전 DX12관련 자료들 – Windows 10 th2 시절
  • 5. • 많은 버그 수정. • DirectX Raytracing지원 • Mesh shader지원 • Direct Storage 지원(예정) • 다수의 DX11/12 겸용 AAA게임들 출시 • Quantum Break • Battle Field 1 • Forza Motor sports series • Forza Horizon series • 기타 등등… 그 동안의 변화
  • 6. • Quantum Break – DX11 > DX12 https://www.computerbase.de/2016-09/quantum-break-steam- benchmark/3/#diagramm-quantum-break-3840-2160-fx-8370 • Battle Field 1 – DX11 >= DX12 http://www.gamestar.de/spiele/battlefield- 1/artikel/battlefield_1_open_beta,53468,3301876.html • F1 2020 – nvidia DX11 >= DX12 , AMD DX12 >=DX11 https://www.guru3d.com/articles-pages/f1-2020-pc-graphics-performance- benchmark-review,4.html DX12성능 – 유명 게임 벤치마크 DX12가 DX11보다 빠르지 않다.
  • 7. 결론부터 얘기하면… DirectX 9/11 운전 보조 장치가 붙어있는 스포츠카 DirectX 12 F1머신. 드라이버 실력이 받쳐주지 못하면 출발도 못함.
  • 8. • 암묵적인(implicit) 처리가 많기 때문에 DirectX runtime과 드라 이버에서 최적화시킬 여지도 많음. 실제로 상당한 최적화가 이 루어져있다. • 지난 십 여년간 GPU회사들이 자사의 드라이버를 엄청나게 최 적화 시켰음. • Single-Thread로만 렌더링을 해도 GPU점유율 100%에 도달할 수 있는 것은 runtime 최적화와 Driver최적화 덕분. DirectX 9/11이 스포츠카라고? DirectX 12에선 이 보조장치들의 지원을 받지 못함.
  • 9. DirectX 12의 문제점 • 거의 대부분의 내장GPU에선 정상 작동 안함. • 정상작동 하는듯 해도 한계상황에 가면 크래시하거나 화면이 깨지거나 하는 일이 다반사 • 이론상 DX Feature Level 11을 지원하면 충분하지만 실제로는 nvidia Maxwell이전 세대 GPU에서 크~게 느리거나 정상작동 하지 않는다. • 코드 양이 적어도 2배 이상 많아진다. 체감 10배. • 굉장히 신경을 쓰지 않으면 시스템 메모리와 GPU메모리 사용 량이 50%이상 더 소모된다. 상당한 노력을 기울여야 겨우 DX11 엔진보다 조금 덜 먹는 수준까지 맞출수 있다.
  • 10. 그럼에도 DX12를 학습할 이유가 있는가? • 몰라서 못하는것과 아는데 안하는건 다르다. • MS가 최신 기능들을 DX12에만 업데이트 해주고 있다. 그들은 결코 실패를 인정하지 않는다. • 따라서 상용엔진의 어플리케이션 레이어만 다룰것이 아니라면, 좋은 싫든 하기는 해야 한다. • 모바일 그래픽 API도 사실상 iOS-Metal, Android-Vulkan이 강 제되고 있다. 개발환경(특히 디버깅)은 MS 플랫폼이 가장 편리 하므로 차세대 API(Metal/Vulkan )로 이행하기 위해선 DX12로 시작하는 편이 적응하기 쉽다.
  • 12. • CPU ->Draw Call -> GPU 처리의 과정을 줄임. • 완전한 비동기 렌더링 • 각종 State들을 한방에 처리 -> • OMSet…RSSet…PSSet…VSSet… -> ID3D12PipenlineState 한 개로. • DirectX runtime과 드라이버에서 해주던 일들을 Application 레 이어로 빼냄.(이 때문에 드라이버에서 최적화를 못해준다.) 성능향상을 위한 DX11 -> DX12 변화(빨라지지도 않았지만)
  • 13. • Resource Binding ->Root Signature / Descriptor Table • Immediate Context -> Command List & Command Queue • State변경 -> ID3D12PipelineState • Shader 코드는 그대로 사용 가능. • D3DX? 텍스쳐 파일 로딩함수도 직접 만들어야함. 다만 이제는 DirectXTex가 D3D12도 지원한다. • 자동으로 이루어졌던 Resource Transition은 ResourceBarrier를 사용해서 직접 처리해야한다. • Dynamic Resource Renaming? 그딴거 없다. API의 변화
  • 14. Resource Binding DX9/11 –> DX12로 포팅작업을 한다면 가장 많 은 시간을 들이게 될…(대부분 여기서 포기한다 는데 500원 건다)
  • 15. • Vertex Buffer • Index Buffer • Texture • Constant Buffer • Unorderd Acceess Buffer (for Compute Shader) • Sampler 렌더링을 위해 이러한 Resource들을 Graphics Pipeline에 bind한다. Resource Binding
  • 16. • RTV로 사용된 리소스는 SRV로 사용하기 전에 Transition되어야 함. • SRV로 지정된 리소스는 RTV로 사용하기 전에 Transition되어야 함. • DX11에선 자동 + implicit 이었으나 DX12에선 수동 + explicit 으로 처리한다. Resource Barrier pCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_pRenderTargetDiffuse, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET)); pCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER:: Transition(m_pRenderTargetDiffuse, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));
  • 17. • Resource의 정보를 기술한 메모리 블록 • CBV,SRV,UAV를 생성하면 그 결과로 이 Descriptor를 얻는다. • 32-64bytes 사이즈.(GPU마다 다름.) • 객체가 아니다. 해제할 필요 없다. • 내부적으로 GPU Memory, CPU Memory pair로 구성됨. • D3D12_GPU_DESCRIPTOR_HANDLE, D3D12_CPU_DESCRIPTOR_HANDLE로 표현되며 사실상 포인터. Descriptor
  • 18. • Descriptor로 사용할 선형 Memory배열 • ID3D12DescriptorHeap로 구현되어 있다. • CPU측 메모리, GPU측 메모리 pair로 구성되어있다. • CBV/SRV/UAV는 이 Descriptor Heap의 CPU/GPU 메모리에 생 성(write)된다. • Descriptor Heap의 CPU측 메모리에 write, Shader에선 GPU메 모리에서 read한다. Descriptor Heap
  • 19. • 어떤(Texture, Constant Buffer, Sampler등) Resource가 어떻게 Pipeline에 bind 될지를 정의 • Resource binding 설정을 기술한 일종의 템플릿이다. Root Signature – ID3D12RootSignature
  • 20. • Descriptor의 논리적 배열 • Descriptor Heap의 임의의 위치가 Descriptor Table에 맵핑된다. Descriptor Table
  • 21. 소스코드 설명 • CreateTextureFromFile • ShadowMap Resource Barrier • CVLMeshObject, RootSignature • Draw SetDescriptorTable
  • 22. TR Matrix Bones Matrix Light Cube Shadow Map material diffuse mask toon pCommandList->SetGraphicsRootDescriptorTable(0, gpuHeap); pCommandList->SetGraphicsRootDescriptorTable(1, gpuHeap); FaceGroup 0 material diffuse mask toon pCommandList->SetGraphicsRootDescriptorTable(1, gpuHeap); FaceGroup 1 material diffuse mask toon pCommandList->SetGraphicsRootDescriptorTable(1, gpuHeap); FaceGroup 2
  • 23. CD3DX12_DESCRIPTOR_RANGE rangesPerObj[3]; rangesPerObj[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 2, 0);// b0 : default , b1 : bones rangesPerObj[1].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 5);// b5 : Light Cube rangesPerObj[2].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 3);// t3 : shadow CD3DX12_DESCRIPTOR_RANGE rangesPerFacegroup[2]; rangesPerFacegroup[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 2);// b2 : material rangesPerFacegroup[1].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 3, 0);// t0 : diffuse , t1 : mask , t2 : toon ta ble CD3DX12_ROOT_PARAMETER rootParameters[2]; rootParameters[0].InitAsDescriptorTable(_countof(rangesPerObj), rangesPerObj, D3D12_SHADER_VISIBILITY_ALL); rootParameters[1].InitAsDescriptorTable(_countof(rangesPerFacegroup), rangesPerFacegroup, D3D12_SHADER_VISIB ILITY_ALL); TR Matrix Bones Matrix Light Cube Shadow Map material diffuse mask b0 b1 b5e t3 b2 t0 t1 toon t2 0 1 2 3 4 5 6 7 Shader Register Descriptor Table Descriptor Heap Root Parameter 0 Root Parameter 1
  • 24. TR Matrix Bones Matrix Light Cube Shadow Map material diffuse mask toon Descriptor Heap material diffuse mask toon material diffuse mask toon 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 필요 Descriptor개수 : 16개 D3D12_GPU_DESCRIPTOR_HANDLE gpuHeap = pDescriptorHeap->GetGPUDescriptorHandleForHeapStart(); pCommandList->IASetVertexBuffer(…); pCommandList->SetGraphicsRootDescriptorTable(0, gpuHeap); for (i=0; i<3; i++) { pCommandList->SetGraphicsRootDescriptorTable(1, gpuHeap); pCommandList->IASetIndexBuffer(…); pCommandList->DrawIndexedInstanced(…); gpuHeap.Offset(4, DescriptorSize); } Object Face Group 0 Face Group 1 Face Group 2
  • 25. Command List & Command Queue • 비동기 렌더링을 위한 디자인 • DX11의 Immediate Context는 더 이상 존재하지 않는다. • Graphics Command를 Command List 에 Recording해서 • Command Queue에 전송. ( 이 시점에 GPU Queue로 전송) • 1개의 Command List만으로도 처리는 가능. -> 성능 안나옴 • 멀티스레드로 여러 개의 Command List를 동시에 recording하 고 각각의 스레드가 독립적으로 Execute하는 것을 권장.
  • 26. Command Queue – 작업 완료전까지 리 소스 유지 • Command Queue에 전송했다고 하는 것이 렌더링 작업의 완료 를 뜻하는 것이 아니다. • Command Queue에 제출한 작업이 완료되기 전에해당 작업에 서 참조하는 D3D리소스들이 해제되어서는 안된다.
  • 27. Command Queue – 완료 체크 • ID3D12Fence객체를 사용해서 작업이 완료되었는지를 표시한다. • ID3D12CommandQueue::Signal(fence, completed value)를 호 출, 전송한 작업이 완료되면 ID3D12Fence객체의 Completed value가 업데이트된다. • ID3D12Fence::GetCompletedValue()로 작업이 완료되었는지를 체크.
  • 28. Command List 0 Clear RTV SetRTV SetPSO Draw Command Queue Command List 1 Clear RTV SetRTV SetPSO Draw Clear RTV SetRTV SetPSO Draw Clear RTV SetRTV SetPSO Draw Execute() Execute() Thread 1 Thread 0 GPU Hardware queue Command Queue
  • 29. • Blend State • Depth State • Render Target format • Shaders… 이 모든 상태들을 하나로 묶어서 처리. Shader 하나, Blend상태 하나 바꾸려고 해도 ID3D12PipelineState를 통째로 바꿔야함. Shader 폭발에 이은 Pipeline State 폭발! Pipeline State – ID3D12PipelineState
  • 31. • 5차원, 6차원, 7차원 ..N차원 배열을 쓰던가… • MS에서 권장하는 방법은 PipelineState cache를 만들어서 사용 하라는 것. • 다양한 렌더링 옵션을 설정하는 상황을 아예 피하게 됨. -> 결 과적으로 툴에서 사용할 API로는 DX12보다 DX11을 선호하게 되낟.
  • 32. DX12로 기본적인 렌더링을 하기 위 한 지식은 이 정도로…
  • 34. • 비동기 렌더링 특성상 API에 잘못된 파라미터를 전달해도 그 즉 시 알기 어려움. • 꼭 버그를 잡기 위함이 아니라 작동원리를 알기 위해서라도 디 버거로 추적해볼 필요가 있다. • Windows 10 Anniversary Update 이후로 DX런타임이나 GPU 드라이버의 버그는 거의 없는것 같다. • DX런타임 또는 드라이버의 버그로 보이더라도 내가 뭘 잘못했 는지 먼저 체크하라. Debugging
  • 35. • 전달된 파라미터의 유효성, Resource Barrier의 상태 등등 프로 그래머의 실수를 미리 잡아준다. • 에러가 아닌데 에러라고 판별할 가능성은 거의 없다. 반드시 무 시하지 말고 체크할 것. ID3D12Debug*pDebugController = NULL; // Enable the D3D12 debug layer. if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pDebugController)))) { pDebugController->EnableDebugLayer(); } D3D12 Debug Layer의 사용
  • 36. exe파일명을 등록시켜 놓으면 해당 app에서 Error나 Warning 발생시 브레이크를 걸 수 있다. DirectX Control Panel
  • 37. • 프레임을 캡쳐해서 렌더링 과정을 보여줌. • Pipeline에 바인드된 D3DResoruce를 추적할 수 있다. • Descriptor Table에 내용을 볼 수 있는 것이 큰 장점. • 딱 잘라 말하건데 이 툴 없이는 개발 불가능. • ALT+F5로 디버거 작동. • ID3D12Object::SetName()으로 이름을 지정해놓으면 그래픽스 디버깅할때 해당 Draw Call을 찾기 쉽다. 이름 가지고 검색도 됨 *_* Visual Studio Graphics Debugger
  • 38. Shadow map 생성 과정을 디버깅 하는 예 ( https://goo.gl/nC5f80 참고 )
  • 39. Shadow map 생성 과정을 디버깅 하는 예 ( https://goo.gl/nC5f80 참고 )
  • 42. • DX11의 Immediate Context에선 한번 설정한 state가 변경하기 전까지 계속 유지됨. • DX12에선 CommandQueue에 기본 설정된 RTV, DSV, Viewport 없음. • DX12에선 Command List를 사용할 때마다 RTV, DSV, Viewport 를 설정할 필요가 있음. • OMSetRenderTarget(), RSSetViewport등은 커맨드 초반에 먼저 호출해줄것. • Fence ->Wait-> Complete 될 때까지 리소스 상태를 유지할것. 자주 하는 실수
  • 44. • 수동으로 GPU H/W Queue를 꽉 채워넣기가 어려움. DX11에선 런타임과 드라이버가 자동으로 해줌. • DX12에선 GPU점유율이 떨어지면 클럭이 낮아짐. • 클럭이 떨어지니 처리속도도 덩달아 느려짐. • GPU가 펑펑 노는게(GPU점유율이 낮게 나옴) 근본적인 문제. 힘들게 포팅했는데 D3D11보다 느리네…
  • 45. • 64KB Align • 한개짜리 Vertex Buffer를 할당해도 최소 64KB • 한개짜리 Index Buffer를 할당해도 최소 64KB • 4Bytes 짜리 Constant Buffer를 할당해도 최소 64KB. • Buffer -> CBV로 사용할땐 256KB Align 필요 • Bulk Memory로 할당해서 쪼개 사용할 것. 메모리는 왜 이리 많이 먹어?
  • 46. • Windows ADK의 Performance Toolkit에 포함된 로그 분석기 1. ADK설치 2. Admin권한으로 CMD을 열고 • C:Program Files (x86)Windows Kits10Windows Performance Toolkitgpuview 폴더로 이동 • >Log.cmd 로 logging시작 • 다시 Log.cmd를 입력해서 logging종료 • Merged.etl파일을 GPUView에서 로드 GPUView
  • 48. • Single-Thread Rendering • 신경 쓴 것이라곤 GPU Memory에 최대한 올려놓고 안건드렸을 뿐 (렌더링중 Map(), Unmap()을 피한다.) • 심지어 D3DResource를 렌더링 중에 마구 변경해가며 재활용하 고 있다. -> DX11은 Resource Renaming으로 이 문제를 해결한 다 • 그럼에도 불구하고 DX11은 GPU Queue를 꽉꽉 채우며 최대한 의 성능을 내주고 있다. DirectX 11 , 과연 안정적인 스포츠카!!!
  • 49. • CPU -> Draw Call -> GPU까지의 과정이 짧아진건 명백한 사실. • 이 부분에선 확실히 성능향상이 있다. • Command List 작성과 Execute의 적절한 배분. • 하나의 Command List에 몰아서 Command를 기록하고 마지막에 Execute 한번만 하면? -> GPU가 펑펑 놀다가 마지막에 한번에 과부하 를 받게 된다. • 여러 개의 Command List를 사용해서 Command기록과 Execute를 동 시에 처리해야할 필요가 있다. • Command List 작성과 Execute의 비동기 처리를 극대화하기 위 해 Multi-Thread Rendering이 필요하다. 최적화할 수 있는 포인트는 뭐가 있을까?
  • 50. From “Direct3D 12 API Preview” in Build 2014 D3D12 runtime의 CPU처리가 훨씬 짧다.
  • 51. • 따라서 비슷한 정도의 GPU점유율이라면 D3D12 엔진이 더 빠 를 것이다. • GPU H/W Queue를 최대한 꽉 채우는 것이 성능 향상의 열쇠. D3D12 runtime의 CPU처리가 훨씬 짧다.
  • 52. • Execute()를 해야만 GPU H/W Queue로 Command전송 • D3D12엔진의 초기버전에선 Execute()를 present()직전에 한번 만 호출했었다. • 그래서 Present 직전까지 GPU가 그냥 놀았다-_-;;;;; • 인간 ABS(from initial D)라고 들어보았는가? • 마치 브레이크를 조밀하고 다다다다다 밟는 것처럼, 게임 루프 중간에서 수동으로 자주자주 커맨드 리스트를 전송해야한다. Execute호출 빈도 조절
  • 53. • 여러 개의 Command List를 미리 할당해 둔다. • Command List 하나당 N개의 오브젝트 렌더링에 대한 Command를 기록. • N개에 도달하면 Execute(), 다음번 Command List에 계속해서 렌더링 Command 기록. • 모든 오브젝트를 다 렌더링하거나 할당해 둔 Command List를 다 사용할 때까지 반복. Command List Pooling
  • 54. • 성능이 상당히 개선되었다. • 그러나 아직도 부족하다. Command List Pooling
  • 55. • Multi-Thread로 Command 작성 시간을 최소화시킨다. • 단순계산으로 n이란 시간이 걸린다면 4 thread를 사용하면 시 간을 n/4로 줄일 수 있다. • GPU Queue가 empty 되지 않도록 최선을 다한다. Multi-Thread Rendering
  • 56. From “Approaching Minimum Overhead with Direct3D12” NVIDIA D3D12에서의 Multi-Thread Rendering
  • 57. • 스레드 1개당 Command List하나씩 배당 • 엔진 내의 Queue에 담긴 오브젝트들을 각 스레드에 균등하게 배분 • 각 스레드는 자신의 Command List에 오브젝트들의 렌더링 Command를 기록 • 마지막 오브젝트까지 처리하고 난 후 Execute() Multi-Thread Rendering 구현
  • 58. Thread 0 Command List Obj 0 Obj 1 Obj 23 Obj 24 . . . Thread 1 Command List Obj 25 Obj 26 Obj 48 Obj 49 . . . Thread 2 Command List Obj 50 Obj 51 Obj 73 Obj 74 . . . Thread 3 Command List Obj 75 Obj 76 Obj 98 Obj 99 . . . Command Queue Execute() Execute() Execute() Execute() Multi-Thread Rendering 구현
  • 59. Present DX12 - 1 Thread Present
  • 62. • CPU작업을 줄이고 되도록 GPU에 부담시킨다. • 멀티스레드 렌더링은 필수 • Execute()를 자주 호출하되, 너무 자주 호출하지 않는다(?) • 하나의 Command List에 너무 많이 몰아서 Execute()하지 않는 다. • 되도록 Wait 하지않는다. • 가능하다면 서로 대기할 필요가 없는 작업들은 여러 개의 Command Queue로 나눠서 Execute한다. Ex) 머리카락 흔들림 을 , 구름처리등은 Compute Shader로 비동기적으로 처리 • Resource는 Bulk Memory로 할당하고 그 안에서 쪼개서 사용한 다. 최적화 가이드
  • 64. Res. 3000x2000 D3D11 D3D12 10 Characters 25 fps 33 fps D3D12 , +32% 100 Characters 18 fps 20 fps D3D12 , +11% 성능비교 Project D Online @Surface Book i5 nvidia dGPU 장비 성능이 떨어질수록(특히 GPU성능이 낮을수록) DX12가 빠를 가능성이 높다.
  • 65. Res. 3000x2000 D3D11 D3D12 1 Character + Voxels 28 fps 37 fps D3D12 , +32% 성능비교 – Voxel Horizon @Surface Book i5 nvidia dGPU 장비 성능이 떨어질수록(특히 GPU성능이 낮을수록) DX12이 빠를 가능성이 높다.
  • 66. Res. 1920x1200 D3D11 D3D12 10 Characters 509 fps 327 fps D3D11 , +55% 100 Characters 171 fps 107 fps D3D11 , +60% 성능비교 Project D Online @Desktop i7 2600K nvidia GTX970 - 1 Thread 장비 성능이 좋으면 좋을수록 (특히 GPU성능이 좋을수록) DX11이 빠르다.
  • 67. Res. 1920x1200 D3D11 D3D12 1 Character + Voxels 478 fps 297 fps D3D11 , +61% 성능비교 – Voxel Horizon @Desktop i7 2600K nvidia GTX970 장비 성능이 좋으면 좋을수록 (특히 GPU성능이 좋을수록) DX11이 빠르다.
  • 68. Res. 1920x1200 D3D12 - 4 Thread D3D12 – 1 Thread 10 Characters 327 fps 227 fps 4 Threads , +44% 100 Characters 107 fps 42 fps 4 Threads , +155% Thread 개수에 따른 성능비교 - Project D Online @Desktop i7 2600K nvidia GTX970 Multi-Threads렌더링은 선택이 아닌 필수!!!!
  • 69. Present Present DX12 4 Threads – 107fps Present Present DX12 1 Threads – 42fps
  • 70. • D3D12로 포팅만 하면 11보다 빠를거라고 생각하면 큰 착각. • Async Compute Shader를 사용할 수 있지만 큰 성능 향상은 기 대하지 말것. • GPU 점유율을 어떻게 높이는가, 즉 GPU 큐에 얼마나 작업을 꽉 꽉 채워넣는가가 성능의 열쇠. • 잘~ 짜면 빨라지긴 빨라진다. 그래도 어지간해선 DX11보다 빠 르진 않다. • DirectX Runtime, Driver로 인한 성능 향상은 꿈꾸지 말것. 결론
  • 71. FAQ • Direct Write와 Direct2D를 쓰고 싶어요. • D3D11 on D3D12를 사용하세요. • D3D12 API는 Thread-safe한가요? • 네. Thread-safe합니다. 별도의 lock을 걸어줄 필요가 없습니다. • 개발자가 능력이 없어서 DX12버전의 성능이 안나오는것 아닌 가요? • Balttle Field 1, Quantum Break의 벤치마크를 참고해주세요. • 단지 DX12에 문제가 있어서 성능이 떨어지는게 아닐까요? Vulkan을 쓰면 DX11보다 빠르지 않을까요? • DX12와 Vulkan의 성능 차이는 거의 없습니다.
  • 72. FAQ • A사 그래픽 카드에선 DX12가 DX11보다 빠르던데? • DX12가 빠른게 아니고 A사 그래픽 카드에서 DX11이 느린겁니다. 드라 이버 성능이 N사보다 떨어져서 그렇습니다. DX11에선 그래픽 드라이 버에서 성능을 올려줄 수 있는 여지가 많습니다.
  • 73. Reference • D3D tag ,megayuchi.com • https://microsoft.github.io/DirectX- Specs/d3d/CPUEfficiency.html • Approaching Minimum Overhead with Direct3D12 • Direct3D 12 API Preview • Efficient Rendering with DirectX 12 on Intel Graphics • DIRECTX ADVANCEMENTS IN THE MANY CORE ERA Getting t he most out of the PC Platform • Using GPUView to Understand your DirectX 11 Game
  • 74. Reference - Dynamic Buffer사용 • https://megayuchi.com/2016/02/01/d3d12%EC%97%94%EC% A7%84-%EA%B0%9C%EB%B0%9C-dynamic-vertexbuffer- %EC%82%AC%EC%9A%A9/ • https://microsoft.github.io/DirectX- Specs/d3d/CPUEfficiency.html • https://docs.microsoft.com/ko- kr/windows/win32/direct3d12/upload-and-readback-of- texture-data • https://software.intel.com/content/www/us/en/develop/article s/tutorial-migrating-your-apps-to-directx-12-part-3.html