SlideShare a Scribd company logo
1 of 53
DirectX 12 엔진 개발
유영천
Microsoft MVP
Visual Studio and Development Technologies
Twitter: @dgtman
Blog : http://megayuchi.wordpress.com
DirectX?
• MS의 Graphics API
• 대응되는 비 Windows계열 API로 OpenGL이 있음.
• 대부분의 Windows 게임과 100%의 XBOX, Wndows Phone게임
이 DirectX를 사용
• 게임 수로 보면 DX9 >>>> DX11 >> DX12
DirectX 12?
• DirectX 12 == Direct 3D12
• Direct 2D, Direct Write를 포함하지 않음.
• D3D외의 기능은 D3D11 on D3D12를 사용하면 됨.
• 성능 최우선!
• CPU 성능이 정체되었다.
• GPU 성능은 정체되지 않았지만 가격이..그리고 데스크탑 점유율이 낮
아지고 있다.
• 현세대 하드웨어만으로 성능 향상을 올릴 수 없을까?
성능 개선을 위한 포인트
• CPU ->Draw Call -> GPU 처리의 과정을 줄임.
• 완전한 비동기 렌더링
• 각종 State들을 한방에 처리 ->
• OMSet…RSSet…PSSet…VSSet… -> ID3D12PipenlineState 한 개로.
• DirectX runtime과 드라이버에서 해주던 일들을 Application레
벨로 빼냄.
• 하지만 그 결과는…..-_-;;;;;;;;
결론부터 얘기하겠습니다.
결론부터 얘기하면…
DirectX 9/11
운전 보조 장치가 붙어있는 스포츠카
DirectX 12
F1머신. 드라이버 실력이 받쳐주지 못하면 출발도 못함.
DirectX 9/11이 스포츠카라고?
• 암묵적인(implicit) 처리가 많기 때문에 DirectX runtime과 드라
이버에서 최적화시킬 여지도 많음. 실제로 상당한 최적화가 이
루어져있다.
• 지난 십 여년간 GPU회사들이 자사의 드라이버를 엄청나게 최
적화 시켰음.
• Single-Thread로만 렌더링을 해도 GPU점유율 100%에 도달할
수 있는 것은 runtime 최적화와 Driver최적화 덕분.
• DirectX 12에선 이 보조장치들의 지원을 받지 못함.
DirectX 12가 필요한가?
• 이미 120프레임 이상으로 성능이 충분히 나오고 있다면 굳이
DX12로 바꿀 필요는 없다.
• Multi-Thread 렌더링을 이미 사용하고 있고 빈틈없는 최적화를
할 자신이 있다면…시도해 볼만 하다.
• GPU병목이 걸려있고 더 이상 최적화 여지가 없어 보인다.
• 45프레임 나오는 게임을 어떻게든 60프레임에 맞추고 싶다.
DirectX 9/11 -> DirectX 12
• Resource Binding
• Command List & Command Queue
• State변경 -> ID3D12PipelineState
• Shader 코드는 그대로 사용 가능.
• D3DX? DirectXTex? -> 그런거 없음. 텍스쳐 파일 로딩함수도 직
접 만들어야함.
• 여기까지 하면 돌아는 간다.-_-
Resource Binding
DX9/11 –> DX12로 포팅작업을 한다면 가장 많
은 시간을 들이게 될…(대부분 여기서 포기한다
는데 500원 건다)
Resource Binding
• Vertex Buffer
• Index Buffer
• Texture
• Constant Buffer
• Unorderd Acceess Buffer (for Compute Shader)
• Sampler
렌더링을 위해 이러한 Resource들을 Graphics Pipeline에 bind한다.
용어정리
• Buffer – ID3D12Resource , D3D에서 사용하는 CPU/GPU 메모
리 블록.
• CBV – Constant Buffer View
• Buffer를 ConstantBuffer로서 Shader에서 사용하기 위한 자료구조.
• SRV – Shader Resource View
• Buffer를 Texture로서 Shader에서 사용하기 위한 자료구조.
• UAV – Unordered Access View
• Buffer를 Compute Shader에서 read/write하기 위한 자료구조
Descriptor
• Resource의 정보를 기술한 메모리 블록
• CBV,SRV,UAV를 생성하면 그 결과로 이 Descriptor를 얻는다.
• Texture(SRV)인지, Constant Buffer(CBV)인…
• 32-64bytes 사이즈.(GPU마다 다름.)
• 객체가 아니다. 해제할 필요 없다.
• 내부적으로 GPU Memory, CPU Memory pair로 구성됨.
• D3D12_GPU_DESCRIPTOR_HANDLE,
D3D12_CPU_DESCRIPTOR_HANDLE로 표현되며 사실상 포인터.
Descriptor Heap
• Descriptor로 사용할 Memory배열
• ID3D12DescriptorHeap로 구현되어 있다.
• CPU측 메모리, GPU측 메모리 pair로 구성되어있다.
• CBV,SRV는 이 Descriptor Heap의 CPU/GPU 메모리에 생성
(write)된다.
• Descriptor Heap의 CPU측 메모리에 write, Shader에선 GPU메
모리에서 read한다.
Root Signature – ID3D12RootSignature
• 어떤(Texture, Contant Buffer, Sampler등) Resource가 어떻게
Pipeline에 bind 될지를 정의
• Resource binding 설정을 기술한 일종의 템플릿이다.
Descriptor Table
• Descriptor의 논리적 배열
• Descriptor Heap의 임의의 위치가 Descriptor Table에 맵핑된다.
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
• 비동기 렌더링을 위한 디자인
• Graphics Command를 Command List 에 Recording해서
• Command Queue에 전송. ( 이 시점에 GPU Queue로 전송)
• 1개의 Command List만으로도 처리는 가능. -> 성능 안나옴
• 멀티스레드로 여러 개의 Command List를 동시에 recording하
고 각각의 스레드가 독립적으로 Execute하는 것을 권장.
Command List 0
Command Queue
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
Pipeline State – ID3D12PipelineState
• Blend State
• Depth State
• Render Target format
• Shaders…
이 모든 상태들을 하나로 묶어서 처리.
Shader 하나, Blend상태 하나 바꾸려고 해도 ID3D12PipelineState를 통째로 바꿔야함.
Shader 폭발에 이은 Pipeline State 폭발!
Pipeline State폭발의 슬픈 예
DX12로 기본적인 렌더링을 하기 위
한 지식은 이 정도로…
Debugging
Debugging
• 비동기 렌더링 특성상 API에 잘못된 파라미터를 전달해도 그 즉
시 알기 어려움.
• DX12 runtime에 아직… 버그가 있는 것으로 보임.
• 각 업체별 GPU드라이버에도 아직 버그가 있는 것으로 보임.
• 그렇지만 대부분의 경우(99%) 프로그래머의 실수이다.
• 오동작하는것 같다면 내가 뭘 잘못했는지 먼저 체크하라.
D3D12 Debug Layer의 사용
• 전달된 파라미터의 유효성, Resource Barrier의 상태 등등 프로
그래머의 실수를 미리 잡아준다.
• 에러가 아닌데 에러라고 판별할 가능성도 없지는 않으나 반드
시 무시하지 말고 체크할 것.
ID3D12Debug*pDebugController = NULL;
// Enable the D3D12 debug layer.
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pDebugController))))
{
pDebugController->EnableDebugLayer();
}
exe파일명을 등록시켜 놓으면 해당 app에서 Error나 Warning
발생시 브레이크를 걸 수 있다.
DirectX Control Panel
Visual Studio Graphics Debugger
• 프레임을 캡쳐해서 렌더링 과정을 보여줌.
• Pipeline에 바인드된 D3DResouce를 추적할 수 있다.
• Descriptor Table에 내용을 볼 수 있는 것이 큰 장점.
• 딱 잘라 말하건데 이 툴 없이는 개발 불가능.
• ALT+F5로 디버거 작동.
Shadow map 생성 과정을 디버깅 하는 예 ( https://goo.gl/nC5f80 참고 )
Shadow map 생성 과정을 디버깅 하는 예 ( https://goo.gl/nC5f80 참고 )
Optimization
힘들게 포팅했는데 D3D11보다 느리네…
• 왜 느린가?
• 앞서 설명했다. D3D11은 온갖 최적화 기법을 갖추고 있다.
• 그에 비해 D3D12는 D3D11의 최적화 기법을 어플리케이션 레벨에서
구현해야한다.
• 그러지 못하면 느리다…많이..
• 최적화의 시간 -> 최적화라 쓰고 다시 만든다고 읽는다.
GPUView
• Mircrosoft 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로 보는 D3D11 vs D3D12
DirectX 11 , 과연 안정적인 스포츠카!!!
• Single-Thread Rendering
• 신경 쓴 것이라곤 GPU Memory에 최대한 올려놓고 안건드렸을
뿐 (avoid Map, Unmap)
• 심지어 D3DResource를 렌더링 중에 마구 변경해가며 재활용하
고 있다. -> DX11은 Resource Renaming으로 이 문제를 해결한
다
• 그럼에도 불구하고 DX11은 GPU Queue를 꽉꽉 채우며 최대한
의 성능을 내주고 있다.
최적화할 수 있는 포인트는 뭐가 있을까?
• 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처리가 훨씬 짧다.
D3D12 runtime의 CPU처리가 훨씬 짧다.
• 따라서 비슷한 정도의 GPU점유율이라면 D3D12 엔진이 더 빠
를 것이다.
• GPU H/W Queue를 최대한 꽉 채우는 것이 성능 향상의 열쇠.
Execute호출 빈도 조절
• Execute()를 해야만 GPU H/W Queue로 Command전송
• D3D11엔진의 초기버전에선 Execute()를 present()직전에 한번
만 호출했었다.
• 그래서 Present 직전까지 GPU가 그냥 놀았다-_-;;;;;
Command List Pooling
• 여러 개의 Command List를 미리 할당해 둔다.
• Command List 하나당 N개의 오브젝트 렌더링에 대한
Command를 기록.
• N개에 도달하면 Execute(), 다음번 Command List에 계속해서
렌더링 Command 기록.
• 모든 오브젝트를 다 렌더링하거나 할당해 둔 Command List를
다 사용할 때까지 반복.
Command List Pooling
• 성능이 상당히 개선되었다.
• 그러나 아직도 부족하다.
Multi-Thread Rendering
• Multi-Thread로 Command 작성 시간을 최소화시킨다.
• 단순계산으로 n이란 시간이 걸린다면 4 thread를 사용하면 시
간을 n/4로 줄일 수 있다.
• GPU Queue가 empty 되지 않도록 최선을 다한다.
D3D12에서의 Multi-Thread Rendering
From “Approaching Minimum Overhead with Direct3D12” NVIDIA
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()
1 Threads Present Present
8 Threads Present Present
Res. 3000x2000 D3D11 D3D12
10 Characters 25 fps 28 fps 11%
100 Characters 16 fps 19 fps 16%
성능비교
(약을 팔진 않겠습니다..정직한 자료….)
@Surface Book i5 nvidia dGPU
Demo
결론
• D3D12로 포팅만 하면 11보다 빠를거라고 생각하면 큰 착각.
• 45프레임 나오는 게임을 60프레임 만들고 싶을 때 사용한다.
• 실질적으로 기대할 수 있는 성능향상폭은 10% - 30%정도.
• 차세대 API는 다 비슷한데 그래도 D3D12가 가장 성능이 잘 나
오는 편.
• DirectX Runtime, Driver의 업데이트로 성능 향샹 가능성이 약간
있음.
• D3D12 API에 더 익숙해지면 조금 더 빨라지긴 할것임.
FAQ
• DirectX 12를 사용 가능한 OS및 디바이스는?
• Windows 10 PC, XBOX ONE, Windows 10 Mobile (Snapdragon 808이
상 장착한 폰에 한해서, Lumia950/950XL)
• Direct Write와 Direct2D를 쓰고 싶어요.
• D3D11 on D2D를 사용하세요.
• D3D12 API는 Thread-safe한가요?
• 네. Thread-safe합니다. 별도의 lock을 걸어줄 필요가 없습니다.
Reference
• yuchi dev D3D tag
• 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

More Related Content

What's hot

조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11민웅 이
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingYEONG-CHEON YOU
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술YEONG-CHEON YOU
 
게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPU게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPUYEONG-CHEON YOU
 
[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리KyeongWon Koo
 
Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5YEONG-CHEON YOU
 
08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드noerror
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현Bongseok Cho
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxTonyCms
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법강 민우
 
Compute shader
Compute shaderCompute shader
Compute shaderQooJuice
 
마칭 큐브 알고리즘 - ZP 2019 데캠
마칭 큐브 알고리즘 - ZP 2019 데캠마칭 큐브 알고리즘 - ZP 2019 데캠
마칭 큐브 알고리즘 - ZP 2019 데캠동환 김
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다Lee Dustin
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능Yongha Kim
 
Direct x 11 입문
Direct x 11 입문Direct x 11 입문
Direct x 11 입문Jin Woo Lee
 
5강 알파와알파소팅
5강 알파와알파소팅5강 알파와알파소팅
5강 알파와알파소팅JP Jung
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션QooJuice
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴예림 임
 

What's hot (20)

조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion Culling
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술
 
게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPU게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPU
 
[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리
 
Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5
 
08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptx
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
 
Compute shader
Compute shaderCompute shader
Compute shader
 
마칭 큐브 알고리즘 - ZP 2019 데캠
마칭 큐브 알고리즘 - ZP 2019 데캠마칭 큐브 알고리즘 - ZP 2019 데캠
마칭 큐브 알고리즘 - ZP 2019 데캠
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능
 
Direct x 11 입문
Direct x 11 입문Direct x 11 입문
Direct x 11 입문
 
5강 알파와알파소팅
5강 알파와알파소팅5강 알파와알파소팅
5강 알파와알파소팅
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴
 
Motion blur
Motion blurMotion blur
Motion blur
 

Viewers also liked

프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~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
 
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리YEONG-CHEON YOU
 
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)Sang Don Kim
 
Build 2016 - P426 - Using the Right Networking API for your UWP App
Build 2016 - P426 - Using the Right Networking API for your UWP AppBuild 2016 - P426 - Using the Right Networking API for your UWP App
Build 2016 - P426 - Using the Right Networking API for your UWP AppWindows Developer
 
[0129 박민근] direct x2d
[0129 박민근] direct x2d[0129 박민근] direct x2d
[0129 박민근] direct x2dMinGeun Park
 
RAD Studio 10 시애틀: 출시 세미나 발표자료
RAD Studio 10 시애틀: 출시 세미나 발표자료RAD Studio 10 시애틀: 출시 세미나 발표자료
RAD Studio 10 시애틀: 출시 세미나 발표자료Devgear
 
[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder
[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder
[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++BuilderDevgear
 
20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발영욱 김
 
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발YEONG-CHEON YOU
 
Universal Windows Platform Overview
Universal Windows Platform OverviewUniversal Windows Platform Overview
Universal Windows Platform OverviewJoshua Copeland
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D흥배 최
 
[Td 2015]맨땅에 헤딩하고 터득한 스토어 공략법(돈벌기)(육주용)
[Td 2015]맨땅에 헤딩하고 터득한 스토어 공략법(돈벌기)(육주용)[Td 2015]맨땅에 헤딩하고 터득한 스토어 공략법(돈벌기)(육주용)
[Td 2015]맨땅에 헤딩하고 터득한 스토어 공략법(돈벌기)(육주용)Sang Don Kim
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계Sungkyun Kim
 
[스마트스터디] 재택근무 잘 하고 있어요
[스마트스터디] 재택근무 잘 하고 있어요[스마트스터디] 재택근무 잘 하고 있어요
[스마트스터디] 재택근무 잘 하고 있어요Hyekyoung Yun
 
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기Mark Lee
 
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해[NDC12] 게임 물리 엔진의 내부 동작 원리 이해
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해종빈 오
 
스타트업에서 기술책임자로 살아가기
스타트업에서 기술책임자로 살아가기스타트업에서 기술책임자로 살아가기
스타트업에서 기술책임자로 살아가기Hyun-woo Park
 

Viewers also liked (20)

프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
 
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
 
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
 
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
 
Build 2016 - P426 - Using the Right Networking API for your UWP App
Build 2016 - P426 - Using the Right Networking API for your UWP AppBuild 2016 - P426 - Using the Right Networking API for your UWP App
Build 2016 - P426 - Using the Right Networking API for your UWP App
 
[0129 박민근] direct x2d
[0129 박민근] direct x2d[0129 박민근] direct x2d
[0129 박민근] direct x2d
 
RAD Studio 10 시애틀: 출시 세미나 발표자료
RAD Studio 10 시애틀: 출시 세미나 발표자료RAD Studio 10 시애틀: 출시 세미나 발표자료
RAD Studio 10 시애틀: 출시 세미나 발표자료
 
[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder
[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder
[데브기어 온라인세미나] 20160504 새로 강화된 기능들 RAD Studio, Delphi, C++Builder
 
20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발
 
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
 
Universal Windows Platform Overview
Universal Windows Platform OverviewUniversal Windows Platform Overview
Universal Windows Platform Overview
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
 
DirectX 11 Rendering in Battlefield 3
DirectX 11 Rendering in Battlefield 3DirectX 11 Rendering in Battlefield 3
DirectX 11 Rendering in Battlefield 3
 
[Td 2015]맨땅에 헤딩하고 터득한 스토어 공략법(돈벌기)(육주용)
[Td 2015]맨땅에 헤딩하고 터득한 스토어 공략법(돈벌기)(육주용)[Td 2015]맨땅에 헤딩하고 터득한 스토어 공략법(돈벌기)(육주용)
[Td 2015]맨땅에 헤딩하고 터득한 스토어 공략법(돈벌기)(육주용)
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
 
[스마트스터디] 재택근무 잘 하고 있어요
[스마트스터디] 재택근무 잘 하고 있어요[스마트스터디] 재택근무 잘 하고 있어요
[스마트스터디] 재택근무 잘 하고 있어요
 
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기
 
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해[NDC12] 게임 물리 엔진의 내부 동작 원리 이해
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해
 
스타트업에서 기술책임자로 살아가기
스타트업에서 기술책임자로 살아가기스타트업에서 기술책임자로 살아가기
스타트업에서 기술책임자로 살아가기
 

Similar to Tips and experience of DX12 Engine development .

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
 
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013devCAT Studio, NEXON
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9진현 조
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기진현 조
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)khuhacker
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhudMinGeun Park
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blogozlael ozlael
 
[0326 박민근] deferred shading
[0326 박민근] deferred shading[0326 박민근] deferred shading
[0326 박민근] deferred shadingMinGeun Park
 
[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp진현 조
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012devCAT Studio, NEXON
 
[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2MinGeun Park
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안Jeongsang Baek
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012Esun Kim
 
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법NAVER D2
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스Sungik Kim
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계Leonardo YongUk Kim
 
Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발Yongho Ji
 

Similar to Tips and experience of DX12 Engine development . (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
 
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blog
 
Modern gpu optimize
Modern gpu optimizeModern gpu optimize
Modern gpu optimize
 
[0326 박민근] deferred shading
[0326 박민근] deferred shading[0326 박민근] deferred shading
[0326 박민근] deferred shading
 
[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
 
[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발
 

More from YEONG-CHEON YOU

DirectStroage프로그래밍소개
DirectStroage프로그래밍소개DirectStroage프로그래밍소개
DirectStroage프로그래밍소개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
 
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
 

More from YEONG-CHEON YOU (17)

DirectStroage프로그래밍소개
DirectStroage프로그래밍소개DirectStroage프로그래밍소개
DirectStroage프로그래밍소개
 
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년 자료)
 

Tips and experience of DX12 Engine development .

  • 1. DirectX 12 엔진 개발 유영천 Microsoft MVP Visual Studio and Development Technologies Twitter: @dgtman Blog : http://megayuchi.wordpress.com
  • 2. DirectX? • MS의 Graphics API • 대응되는 비 Windows계열 API로 OpenGL이 있음. • 대부분의 Windows 게임과 100%의 XBOX, Wndows Phone게임 이 DirectX를 사용 • 게임 수로 보면 DX9 >>>> DX11 >> DX12
  • 3. DirectX 12? • DirectX 12 == Direct 3D12 • Direct 2D, Direct Write를 포함하지 않음. • D3D외의 기능은 D3D11 on D3D12를 사용하면 됨. • 성능 최우선! • CPU 성능이 정체되었다. • GPU 성능은 정체되지 않았지만 가격이..그리고 데스크탑 점유율이 낮 아지고 있다. • 현세대 하드웨어만으로 성능 향상을 올릴 수 없을까?
  • 4. 성능 개선을 위한 포인트 • CPU ->Draw Call -> GPU 처리의 과정을 줄임. • 완전한 비동기 렌더링 • 각종 State들을 한방에 처리 -> • OMSet…RSSet…PSSet…VSSet… -> ID3D12PipenlineState 한 개로. • DirectX runtime과 드라이버에서 해주던 일들을 Application레 벨로 빼냄. • 하지만 그 결과는…..-_-;;;;;;;;
  • 6. 결론부터 얘기하면… DirectX 9/11 운전 보조 장치가 붙어있는 스포츠카 DirectX 12 F1머신. 드라이버 실력이 받쳐주지 못하면 출발도 못함.
  • 7. DirectX 9/11이 스포츠카라고? • 암묵적인(implicit) 처리가 많기 때문에 DirectX runtime과 드라 이버에서 최적화시킬 여지도 많음. 실제로 상당한 최적화가 이 루어져있다. • 지난 십 여년간 GPU회사들이 자사의 드라이버를 엄청나게 최 적화 시켰음. • Single-Thread로만 렌더링을 해도 GPU점유율 100%에 도달할 수 있는 것은 runtime 최적화와 Driver최적화 덕분. • DirectX 12에선 이 보조장치들의 지원을 받지 못함.
  • 8. DirectX 12가 필요한가? • 이미 120프레임 이상으로 성능이 충분히 나오고 있다면 굳이 DX12로 바꿀 필요는 없다. • Multi-Thread 렌더링을 이미 사용하고 있고 빈틈없는 최적화를 할 자신이 있다면…시도해 볼만 하다. • GPU병목이 걸려있고 더 이상 최적화 여지가 없어 보인다. • 45프레임 나오는 게임을 어떻게든 60프레임에 맞추고 싶다.
  • 9. DirectX 9/11 -> DirectX 12 • Resource Binding • Command List & Command Queue • State변경 -> ID3D12PipelineState • Shader 코드는 그대로 사용 가능. • D3DX? DirectXTex? -> 그런거 없음. 텍스쳐 파일 로딩함수도 직 접 만들어야함. • 여기까지 하면 돌아는 간다.-_-
  • 10. Resource Binding DX9/11 –> DX12로 포팅작업을 한다면 가장 많 은 시간을 들이게 될…(대부분 여기서 포기한다 는데 500원 건다)
  • 11. Resource Binding • Vertex Buffer • Index Buffer • Texture • Constant Buffer • Unorderd Acceess Buffer (for Compute Shader) • Sampler 렌더링을 위해 이러한 Resource들을 Graphics Pipeline에 bind한다.
  • 12. 용어정리 • Buffer – ID3D12Resource , D3D에서 사용하는 CPU/GPU 메모 리 블록. • CBV – Constant Buffer View • Buffer를 ConstantBuffer로서 Shader에서 사용하기 위한 자료구조. • SRV – Shader Resource View • Buffer를 Texture로서 Shader에서 사용하기 위한 자료구조. • UAV – Unordered Access View • Buffer를 Compute Shader에서 read/write하기 위한 자료구조
  • 13. Descriptor • Resource의 정보를 기술한 메모리 블록 • CBV,SRV,UAV를 생성하면 그 결과로 이 Descriptor를 얻는다. • Texture(SRV)인지, Constant Buffer(CBV)인… • 32-64bytes 사이즈.(GPU마다 다름.) • 객체가 아니다. 해제할 필요 없다. • 내부적으로 GPU Memory, CPU Memory pair로 구성됨. • D3D12_GPU_DESCRIPTOR_HANDLE, D3D12_CPU_DESCRIPTOR_HANDLE로 표현되며 사실상 포인터.
  • 14. Descriptor Heap • Descriptor로 사용할 Memory배열 • ID3D12DescriptorHeap로 구현되어 있다. • CPU측 메모리, GPU측 메모리 pair로 구성되어있다. • CBV,SRV는 이 Descriptor Heap의 CPU/GPU 메모리에 생성 (write)된다. • Descriptor Heap의 CPU측 메모리에 write, Shader에선 GPU메 모리에서 read한다.
  • 15. Root Signature – ID3D12RootSignature • 어떤(Texture, Contant Buffer, Sampler등) Resource가 어떻게 Pipeline에 bind 될지를 정의 • Resource binding 설정을 기술한 일종의 템플릿이다.
  • 16. Descriptor Table • Descriptor의 논리적 배열 • Descriptor Heap의 임의의 위치가 Descriptor Table에 맵핑된다.
  • 17. 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
  • 18. 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
  • 19. 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
  • 20. Command List & Command Queue • 비동기 렌더링을 위한 디자인 • Graphics Command를 Command List 에 Recording해서 • Command Queue에 전송. ( 이 시점에 GPU Queue로 전송) • 1개의 Command List만으로도 처리는 가능. -> 성능 안나옴 • 멀티스레드로 여러 개의 Command List를 동시에 recording하 고 각각의 스레드가 독립적으로 Execute하는 것을 권장.
  • 21. Command List 0 Command Queue 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
  • 22. Pipeline State – ID3D12PipelineState • Blend State • Depth State • Render Target format • Shaders… 이 모든 상태들을 하나로 묶어서 처리. Shader 하나, Blend상태 하나 바꾸려고 해도 ID3D12PipelineState를 통째로 바꿔야함. Shader 폭발에 이은 Pipeline State 폭발!
  • 24. DX12로 기본적인 렌더링을 하기 위 한 지식은 이 정도로…
  • 26. Debugging • 비동기 렌더링 특성상 API에 잘못된 파라미터를 전달해도 그 즉 시 알기 어려움. • DX12 runtime에 아직… 버그가 있는 것으로 보임. • 각 업체별 GPU드라이버에도 아직 버그가 있는 것으로 보임. • 그렇지만 대부분의 경우(99%) 프로그래머의 실수이다. • 오동작하는것 같다면 내가 뭘 잘못했는지 먼저 체크하라.
  • 27. D3D12 Debug Layer의 사용 • 전달된 파라미터의 유효성, Resource Barrier의 상태 등등 프로 그래머의 실수를 미리 잡아준다. • 에러가 아닌데 에러라고 판별할 가능성도 없지는 않으나 반드 시 무시하지 말고 체크할 것. ID3D12Debug*pDebugController = NULL; // Enable the D3D12 debug layer. if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pDebugController)))) { pDebugController->EnableDebugLayer(); }
  • 28. exe파일명을 등록시켜 놓으면 해당 app에서 Error나 Warning 발생시 브레이크를 걸 수 있다. DirectX Control Panel
  • 29. Visual Studio Graphics Debugger • 프레임을 캡쳐해서 렌더링 과정을 보여줌. • Pipeline에 바인드된 D3DResouce를 추적할 수 있다. • Descriptor Table에 내용을 볼 수 있는 것이 큰 장점. • 딱 잘라 말하건데 이 툴 없이는 개발 불가능. • ALT+F5로 디버거 작동.
  • 30. Shadow map 생성 과정을 디버깅 하는 예 ( https://goo.gl/nC5f80 참고 )
  • 31. Shadow map 생성 과정을 디버깅 하는 예 ( https://goo.gl/nC5f80 참고 )
  • 33. 힘들게 포팅했는데 D3D11보다 느리네… • 왜 느린가? • 앞서 설명했다. D3D11은 온갖 최적화 기법을 갖추고 있다. • 그에 비해 D3D12는 D3D11의 최적화 기법을 어플리케이션 레벨에서 구현해야한다. • 그러지 못하면 느리다…많이.. • 최적화의 시간 -> 최적화라 쓰고 다시 만든다고 읽는다.
  • 34. GPUView • Mircrosoft 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에서 로드
  • 36. DirectX 11 , 과연 안정적인 스포츠카!!! • Single-Thread Rendering • 신경 쓴 것이라곤 GPU Memory에 최대한 올려놓고 안건드렸을 뿐 (avoid Map, Unmap) • 심지어 D3DResource를 렌더링 중에 마구 변경해가며 재활용하 고 있다. -> DX11은 Resource Renaming으로 이 문제를 해결한 다 • 그럼에도 불구하고 DX11은 GPU Queue를 꽉꽉 채우며 최대한 의 성능을 내주고 있다.
  • 37. 최적화할 수 있는 포인트는 뭐가 있을까? • CPU -> Draw Call -> GPU까지의 과정이 짧아진건 명백한 사실. • 이 부분에선 확실히 성능향상이 있다. • Command List 작성과 Execute의 적절한 배분. • 하나의 Command List에 몰아서 Command를 기록하고 마지막에 Execute 한번만 하면? • GPU가 펑펑 놀다가 마지막에 한번에 과부하를 받게 된다. • 여러 개의 Command List를 사용해서 Command기록과 Execute를 동 시에 처리해야할 필요가 있다. • Command List 작성과 Execute의 비동기 처리를 극대화하기 위 해 Multi-Thread Rendering이 필요하다.
  • 38. From “Direct3D 12 API Preview” in Build 2014 D3D12 runtime의 CPU처리가 훨씬 짧다.
  • 39. D3D12 runtime의 CPU처리가 훨씬 짧다. • 따라서 비슷한 정도의 GPU점유율이라면 D3D12 엔진이 더 빠 를 것이다. • GPU H/W Queue를 최대한 꽉 채우는 것이 성능 향상의 열쇠.
  • 40. Execute호출 빈도 조절 • Execute()를 해야만 GPU H/W Queue로 Command전송 • D3D11엔진의 초기버전에선 Execute()를 present()직전에 한번 만 호출했었다. • 그래서 Present 직전까지 GPU가 그냥 놀았다-_-;;;;;
  • 41. Command List Pooling • 여러 개의 Command List를 미리 할당해 둔다. • Command List 하나당 N개의 오브젝트 렌더링에 대한 Command를 기록. • N개에 도달하면 Execute(), 다음번 Command List에 계속해서 렌더링 Command 기록. • 모든 오브젝트를 다 렌더링하거나 할당해 둔 Command List를 다 사용할 때까지 반복.
  • 42. Command List Pooling • 성능이 상당히 개선되었다. • 그러나 아직도 부족하다.
  • 43. Multi-Thread Rendering • Multi-Thread로 Command 작성 시간을 최소화시킨다. • 단순계산으로 n이란 시간이 걸린다면 4 thread를 사용하면 시 간을 n/4로 줄일 수 있다. • GPU Queue가 empty 되지 않도록 최선을 다한다.
  • 44. D3D12에서의 Multi-Thread Rendering From “Approaching Minimum Overhead with Direct3D12” NVIDIA
  • 45. Multi-Thread Rendering 구현 • 스레드 1개당 Command List하나씩 배당 • 엔진 내의 Queue에 담긴 오브젝트들을 각 스레드에 균등하게 배분 • 각 스레드는 자신의 Command List에 오브젝트들의 렌더링 Command를 기록 • 마지막 오브젝트까지 처리하고 난 후 Execute()
  • 46. 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()
  • 47. 1 Threads Present Present
  • 48. 8 Threads Present Present
  • 49. Res. 3000x2000 D3D11 D3D12 10 Characters 25 fps 28 fps 11% 100 Characters 16 fps 19 fps 16% 성능비교 (약을 팔진 않겠습니다..정직한 자료….) @Surface Book i5 nvidia dGPU
  • 50. Demo
  • 51. 결론 • D3D12로 포팅만 하면 11보다 빠를거라고 생각하면 큰 착각. • 45프레임 나오는 게임을 60프레임 만들고 싶을 때 사용한다. • 실질적으로 기대할 수 있는 성능향상폭은 10% - 30%정도. • 차세대 API는 다 비슷한데 그래도 D3D12가 가장 성능이 잘 나 오는 편. • DirectX Runtime, Driver의 업데이트로 성능 향샹 가능성이 약간 있음. • D3D12 API에 더 익숙해지면 조금 더 빨라지긴 할것임.
  • 52. FAQ • DirectX 12를 사용 가능한 OS및 디바이스는? • Windows 10 PC, XBOX ONE, Windows 10 Mobile (Snapdragon 808이 상 장착한 폰에 한해서, Lumia950/950XL) • Direct Write와 Direct2D를 쓰고 싶어요. • D3D11 on D2D를 사용하세요. • D3D12 API는 Thread-safe한가요? • 네. Thread-safe합니다. 별도의 lock을 걸어줄 필요가 없습니다.
  • 53. Reference • yuchi dev D3D tag • 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