SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
DirectStorage프로그래밍
소개
유영천
https://megayuchi.com
Tw: @dgtman
미리 공지
• DirectStorage를 사용한 프로그래밍 요령을 소개합니다.
• DirectStorage의 모든 것을 다루지 않습니다(못합니다).
• 상세한 공식 문서는 현재 GDKX(for XBOX)로만 제공되기 때문에
id@xbox프로그램에 가입되어 있지 않으면 전적으로 샘플코드에
의존해야합니다.
• DirectStorage는 DirectX 12시스템의 일부입니다. 따라서 DirectX
12프로그래밍을 전혀 모른다면 DirectStorage프로그래밍을
학습할 수도 적용할 수도 없습니다.
DirectStorage?
DirectStorage
• GPU측 메모리에 데이터를 올리려면 기존에는 ‘storage-> upload
buffer->GPU 메모리’의 단계를 거쳐야 했다.
(https://youtu.be/lHlAloRa-HI)
• Direct Storage를 사용하면 코드상으로는 ‘storage -> GPU 메모리’로
직접 올리는 것처럼 작동한다.
• 현재는 PC의 경우 내부적으로 storage->upload buffer-
>GPU메모리로 전송한다.
• DirectStorage는 NVME storage를 억세스 하는 최적화된 API이다.
Std File I/O보다 훨씬 효율적이라고 한다.
• I/O는 비동기/병렬적으로 처리된다.
• Storage에서 읽어서 메모리에 올릴 때 GPU기능을 이용해서
압축해제(일부 압축방식만 지원)하거나 CPU를 이용한 자체
포맷의 압축을 해제할 수 있다.
• ID3D12Resource로 표현되는 모든 리소스에 대해 적용 가능.
Texture, Vertex Buffer, Index Buffer등. 실질적으로는 Texture에 가장
많이 사용될 것으로 보인다.
DirectStorage
샘플코드 분석
• microsoft/DirectStorage: DirectStorage for Windows is an API that
allows game developers to unlock the full potential of high speed
NVMe drives for loading game assets. (github.com)
• DirectStorage/Samples/HelloDirectStorage/
• 기본적인 작동방법
• DirectStorage/Samples/MiniEngine/ModelViewer/
• 패키징 파일 만들기
• 로딩시 압축풀기
• Storage->D3D12Resource로 업로드
실전적용
실전적용을 해야 내 기술이 된다.
환경세팅
• NuGet package로 제공.
• Solution Explorer->Manage NuGet Packages for solution -> Browse->
DirectStorage로 검색
파일 패키징
• 개별 파일을 하나하나 로드 하면 DirectStorage를 사용할 이유가
없다.
• 각 파일에는 헤더가 붙어있고 sub resource 사이의 padding이
존재할 수 있기 때문에 원시 파일로는 배치처리를 할 수 없다.
• 결국 데이터를 가공해야 한다.
• 여러 개의 원시 파일의 헤더파트와 raw데이터 파트를 떼서 패키징
파일로 만든다.
• 패키징 파일을 따로 만들고 offset으로 읽어 들이는 시점에서
DirectStorage를 사용하지 않아도 성능이 향상된다.
#0 face_000.dds
D3D12_RESOURCE_DESC
Offset: 604
Data Size: 4096
#1 body_000.dds
D3D12_RESOURCE_DESC
Offset: 4700
Data Size: 16384
RAW DATA
(0)
RAW DATA
(1)
Count(3)
#2 tree_001.dds
D3D12_RESOURCE_DESC
Offset: 21084
Data Size: 8192
RAW DATA
(2)
Packed File
200 Bytes 200 Bytes 200 Bytes 4096 Bytes 16384 Bytes 8192 Bytes
4 Bytes
RAW DATA
face_000.dds
Data Size: 4096
RAW DATA
body_000.dds
Data Size: 16384
RAW DATA
tree_001.dds
Data Size: 8192
Source file Source file Source file
DirectStorage를 이용한 File -> GPU 로딩
1. 패키징 파일이 몇 개의 데이터를 포함하고 있는지 개수를 얻는다.
2. 1에서 얻은 개수로 각 데이터의 헤더 파트의 메모리를 할당
3. 파일의 데이터(header data)-> 시스템 메모리의
DSTORAGE_REQUEST를 IDStorageQueue에 enqueue한다.
4. DirectStorage를 이용해서 File -> Memory로 헤더 파트를 batch 로딩.
5. 각 파일의 헤더 데이터를 참조하여 로딩의 목적지가 될
ID3D12Resource를 생성.
6. 파일의 데이터(raw data)-> GPU리소스의 DSTORAGE_REQUEST를
IDStorageQueue에 enqueue한다.
7. Submit하고 결과를 wait.
#0 face_000.dds
D3D12_RESOURCE_DESC
Offset: 604
Data Size: 4096
#1 body_000.dds
D3D12_RESOURCE_DESC
Offset: 4700
Data Size: 16384
RAW DATA
(0)
RAW DATA
(1)
Count(3)
#2 tree_001.dds
D3D12_RESOURCE_DESC
Offset: 21084
Data Size: 8192
RAW DATA
(2)
3
Read
#0 face_000.dds
D3D12_RESOURCE_DESC
Offset: 604
Data Size: 4096
#1 body_000.dds
D3D12_RESOURCE_DESC
Offset: 4700
Data Size: 16384
RAW DATA
(0)
RAW DATA
(1)
Count(3)
#2 tree_001.dds
D3D12_RESOURCE_DESC
Offset: 21084
Data Size: 8192
RAW DATA
(2)
Read
IDStorageQueue
DSTORAGE_REQUEST
Source: FILE;
Destination:MEMORY
Offset = 4
Size = 200*3 = 600
3
Read
ID3D12Resource #0 ID3D12Resource #1 ID3D12Resource #2
Create D3DResources
#0 face_000.dds
D3D12_RESOURCE_DESC
Offset: 604
Data Size: 4096
#1 body_000.dds
D3D12_RESOURCE_DESC
Offset: 4700
Data Size: 16384
RAW DATA
(0)
RAW DATA
(1)
Count(3)
#2 tree_001.dds
D3D12_RESOURCE_DESC
Offset: 21084
Data Size: 8192
RAW DATA
(2)
Read
IDStorageQueue (to Memory)
DSTORAGE_REQUEST
Source: FILE;
Destination:MEMORY
Offset = 4
Size = 200*3 = 600
3
Read
ID3D12Resource #0 ID3D12Resource #1 ID3D12Resource #2
IDStorageQueue (to GPU)
DSTORAGE_REQUEST
Source: FILE;
Destination:
D3D12_RESOURCE
Offset = 604
Size = 4096
DSTORAGE_REQUEST
Source: FILE;
Destination:
D3D12_RESOURCE
Offset = 4700
Size = 16384
DSTORAGE_REQUEST
Source: FILE;
Destination:
D3D12_RESOURCE
Offset = 21084
Size = 8192
Read
기존 엔진(자체 엔진)에 적용
• 텍스처 캐시로 적용
• 기존 텍스처 로딩 함수를 대체
Resource Manager
file name hash table
face.dds
body.dds
tree.dds
rock.dds
LoadDDS() File
Texture Manager
LoadTextureFile(“body.dds”);
먼저 Hash table에서 찾아보고 해당 텍스처가 로드되어 있으면 ref count를 증가시키고 텍스처 데이터를 리턴
Resource Manager
File
file name hash table
face.dds
body.dds
tree.dds
rock.dds
LoadDDS()
LoadTextureFile(“finger.dds”);
finger.dds
Texture Manager
Hash table에 없으면 파일에서 읽고 hash table에 등록.
텍스처 캐시로 적용
• 텍스처 캐시는 DirectStorage를 사용하지 않아도 구현할 수 있다.
• DirectStorage를 사용하면 최적화된 I/O성능을 제공하므로 텍스처
캐시의 로딩 시간을 줄일 수 있다.
• 텍스처 캐시로 사용되는 GPU메모리가 낭비된다.
• 그에 비해 성능 향샹은 미비할 수 있다. 전체 로딩 시간 중 텍스처
로딩이 얼마나 차지하는지가 중요.
Resource Manager
file name hash table
face.dds
body.dds
tree.dds
rock.dds
LoadDDS() File
Texture Manager
자주 사용하는 텍스처들을 초기화시 왕창 읽어서 미리 file name hash table에 등록해 둔다.
Std file I/O 대신 DirectStorage를 사용하면 초기 텍스처 캐시 로딩 시간이 짧아진다.
finger.dds
Texture Cache Loader
Std file I/O
or
DirectStorage
기존 텍스처 로딩 함수를 대체
• 텍스처 로딩 함수 호출시 IDStorageQueue에 enqueue만 해둔다.
• 게임 루프중에 Submit/Wait 한다. 또는 enqueue중 일정 개수마다
submit/wait한다(내부적으로 Queue의 대기열이 절반 이상 차면
자동으로 submit한다고 한다).
• 프로그래밍의 편리함 측면에서는 DirectStorage를 사용하는 쪽이
기존 방식보다 편할 수 있다.
• D3D12에서는 DirectStorage를 사용하지 않는 기존 스타일이
프로그래밍하기에 더 복잡하다.
• 대용량의 텍스처가 엄청나게 많은 경우가 아니면 실질적으로
성능 차이를 체감하기 어렵다.
Resource Manager
file name hash table
face.dds
body.dds
tree.dds
rock.dds
LoadDDS()
File
Texture Manager
개별 텍스처 로딩 시 DirectStorage를 사용한다.
로딩함수 호출시에는 enqueue만 해 두고 일정 개수 씩 모아서 submit/wait한다. 개별 로딩 시간 단축.
finger.dds
Direct Storage
Loader
LoadTextureFile(“finger.dds”);
성능 비교 – texture cache 로딩 시간
std file I/O(Sync-
Upload Buffer)
std File I/O(Async-
upload buffer) DirectStorage
i7 8700K , SSD
970EVO+ RAID 1061.19 ms 925.92 ms 681.03 ms +26%
EPIC 7v12 64
(Azure VM, HDD) 12861.29 ms 11613.92 ms 10846.57 ms +6%
Surface Book 1(SSD) 2012.39 ms 1910.86 ms 1206.59 ms +36%
(288MB textures)
결론
• 액면 그대로 ‘Storage-> GPU 메모리’ 로딩만 수행할 경우 분명한 성능
향상이 있다.(하지만 극적인 성능 향상은 아니다.)
• 게임에서의 Loading이라고 하는 표현은 오만가지 종류의 작업을
포함한다. 따라서 텍스처 로딩 속도가 빨라진다고 해서 로딩 속도가
크게 향상된다고 보기는 어렵다.
• 충분한 성능을 가진 PC에서는 더더욱 성능 향상이 적다.
• D3D12에서 ‘파일 ->Upload Buffer -> GPU리소스’ 로 전송하는 단계를
비동기적으로 처리하려면 상당히 빡시다. 따라서 이렇게 처리하느니
Dstorage를 사용하는 편이 나을수도 있다(프로그래밍 편의상).
• Sparse Virtual Texturing를 사용할 경우는 큰 성능향상이 있을지도
모른다(구현 안해봐서 확신할 수 없음)
결론
• 그래도 응용해볼 여지는 많이 있으니 추후 성공적인 사례가
나올지도? 열심히 시도해 보세요.
참고자료
• microsoft/DirectStorage: DirectStorage for Windows is an API that
allows game developers to unlock the full potential of high speed
NVMe drives for loading game assets. (github.com)
• DirectStorage/DeveloperGuidance.md at main ·
microsoft/DirectStorage (github.com)
• D3D12 리소스 관리 전략(https://youtu.be/lHlAloRa-HI)

Contenu connexe

Tendances

스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)포프 김
 
FrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteFrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteElectronic Arts / DICE
 
Secrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologySecrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologyTiago Sousa
 
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화Jongwon Kim
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingYEONG-CHEON YOU
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술Ki Hyunwoo
 
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근MinGeun Park
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
Dissecting the Rendering of The Surge
Dissecting the Rendering of The SurgeDissecting the Rendering of The Surge
Dissecting the Rendering of The SurgePhilip Hammer
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화Seungmo Koo
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shadingMinGeun Park
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술YEONG-CHEON YOU
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들MinGeun Park
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기Yongha Kim
 
Optimize your game with the Profile Analyzer - Unite Copenhagen 2019
Optimize your game with the Profile Analyzer - Unite Copenhagen 2019Optimize your game with the Profile Analyzer - Unite Copenhagen 2019
Optimize your game with the Profile Analyzer - Unite Copenhagen 2019Unity Technologies
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
Siggraph 2011: Occlusion culling in Alan Wake
Siggraph 2011: Occlusion culling in Alan WakeSiggraph 2011: Occlusion culling in Alan Wake
Siggraph 2011: Occlusion culling in Alan WakeUmbra
 

Tendances (20)

스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
 
FrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteFrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in Frostbite
 
Secrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologySecrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics Technology
 
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion Culling
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
 
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
Dissecting the Rendering of The Surge
Dissecting the Rendering of The SurgeDissecting the Rendering of The Surge
Dissecting the Rendering of The Surge
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 
Light prepass
Light prepassLight prepass
Light prepass
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
 
Voxelizaition with GPU
Voxelizaition with GPUVoxelizaition with GPU
Voxelizaition with GPU
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
 
Optimize your game with the Profile Analyzer - Unite Copenhagen 2019
Optimize your game with the Profile Analyzer - Unite Copenhagen 2019Optimize your game with the Profile Analyzer - Unite Copenhagen 2019
Optimize your game with the Profile Analyzer - Unite Copenhagen 2019
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
Siggraph 2011: Occlusion culling in Alan Wake
Siggraph 2011: Occlusion culling in Alan WakeSiggraph 2011: Occlusion culling in Alan Wake
Siggraph 2011: Occlusion culling in Alan Wake
 

Similaire à DirectStroage프로그래밍소개

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
 
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
 
Big data analysis with R and Apache Tajo (in Korean)
Big data analysis with R and Apache Tajo (in Korean)Big data analysis with R and Apache Tajo (in Korean)
Big data analysis with R and Apache Tajo (in Korean)Gruter
 
[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp진현 조
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드cranbe95
 
[week14] Getting started with D3.js
[week14] Getting started with D3.js[week14] Getting started with D3.js
[week14] Getting started with D3.jsneuroassociates
 
Tensorflow로 플로이드 클라우드에서 합성곱 신경망 (CNN) 구현해보기
Tensorflow로 플로이드 클라우드에서 합성곱 신경망 (CNN) 구현해보기 Tensorflow로 플로이드 클라우드에서 합성곱 신경망 (CNN) 구현해보기
Tensorflow로 플로이드 클라우드에서 합성곱 신경망 (CNN) 구현해보기 SEUNGWOO LEE
 
2019스마트국토엑스포-20190808-mago3D기술워크샵
2019스마트국토엑스포-20190808-mago3D기술워크샵2019스마트국토엑스포-20190808-mago3D기술워크샵
2019스마트국토엑스포-20190808-mago3D기술워크샵Gaia3D,Inc.
 
Tajo korea meetup oct 2015-spatial tajo
Tajo korea meetup oct 2015-spatial tajoTajo korea meetup oct 2015-spatial tajo
Tajo korea meetup oct 2015-spatial tajoBD
 
docker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
docker on GCE ( JIRA & Confluence ) - GDG Korea Clouddocker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
docker on GCE ( JIRA & Confluence ) - GDG Korea CloudJude Kim
 
[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준NAVER D2
 
mago3d workshop in FOSS4G Korea 2018
mago3d workshop in FOSS4G Korea 2018mago3d workshop in FOSS4G Korea 2018
mago3d workshop in FOSS4G Korea 2018Gaia3D,Inc.
 
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWSMatthew (정재화)
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
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
 
SQL Server에서 Django를 추구하면 안 되는 걸까?
SQL Server에서 Django를 추구하면 안 되는 걸까?SQL Server에서 Django를 추구하면 안 되는 걸까?
SQL Server에서 Django를 추구하면 안 되는 걸까?태환 김
 
Mapreduce tuning
Mapreduce tuningMapreduce tuning
Mapreduce tuningGruter
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdfSeokju Hong
 

Similaire à DirectStroage프로그래밍소개 (20)

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
 
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
 
Big data analysis with R and Apache Tajo (in Korean)
Big data analysis with R and Apache Tajo (in Korean)Big data analysis with R and Apache Tajo (in Korean)
Big data analysis with R and Apache Tajo (in Korean)
 
[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
 
[week14] Getting started with D3.js
[week14] Getting started with D3.js[week14] Getting started with D3.js
[week14] Getting started with D3.js
 
Tensorflow로 플로이드 클라우드에서 합성곱 신경망 (CNN) 구현해보기
Tensorflow로 플로이드 클라우드에서 합성곱 신경망 (CNN) 구현해보기 Tensorflow로 플로이드 클라우드에서 합성곱 신경망 (CNN) 구현해보기
Tensorflow로 플로이드 클라우드에서 합성곱 신경망 (CNN) 구현해보기
 
Hadoop overview
Hadoop overviewHadoop overview
Hadoop overview
 
2019스마트국토엑스포-20190808-mago3D기술워크샵
2019스마트국토엑스포-20190808-mago3D기술워크샵2019스마트국토엑스포-20190808-mago3D기술워크샵
2019스마트국토엑스포-20190808-mago3D기술워크샵
 
Tajo korea meetup oct 2015-spatial tajo
Tajo korea meetup oct 2015-spatial tajoTajo korea meetup oct 2015-spatial tajo
Tajo korea meetup oct 2015-spatial tajo
 
docker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
docker on GCE ( JIRA & Confluence ) - GDG Korea Clouddocker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
docker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
 
[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준
 
mago3d workshop in FOSS4G Korea 2018
mago3d workshop in FOSS4G Korea 2018mago3d workshop in FOSS4G Korea 2018
mago3d workshop in FOSS4G Korea 2018
 
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
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
 
SQL Server에서 Django를 추구하면 안 되는 걸까?
SQL Server에서 Django를 추구하면 안 되는 걸까?SQL Server에서 Django를 추구하면 안 되는 걸까?
SQL Server에서 Django를 추구하면 안 되는 걸까?
 
Mapreduce tuning
Mapreduce tuningMapreduce tuning
Mapreduce tuning
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdf
 
Hadoop administration
Hadoop administrationHadoop administration
Hadoop administration
 

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
 
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
 
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
 

Plus de YEONG-CHEON YOU (19)

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 충돌 및 이동처리 설계와 구현
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
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 앱 개발의 세계로~
 
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
 

DirectStroage프로그래밍소개

  • 2. 미리 공지 • DirectStorage를 사용한 프로그래밍 요령을 소개합니다. • DirectStorage의 모든 것을 다루지 않습니다(못합니다). • 상세한 공식 문서는 현재 GDKX(for XBOX)로만 제공되기 때문에 id@xbox프로그램에 가입되어 있지 않으면 전적으로 샘플코드에 의존해야합니다. • DirectStorage는 DirectX 12시스템의 일부입니다. 따라서 DirectX 12프로그래밍을 전혀 모른다면 DirectStorage프로그래밍을 학습할 수도 적용할 수도 없습니다.
  • 4. DirectStorage • GPU측 메모리에 데이터를 올리려면 기존에는 ‘storage-> upload buffer->GPU 메모리’의 단계를 거쳐야 했다. (https://youtu.be/lHlAloRa-HI) • Direct Storage를 사용하면 코드상으로는 ‘storage -> GPU 메모리’로 직접 올리는 것처럼 작동한다. • 현재는 PC의 경우 내부적으로 storage->upload buffer- >GPU메모리로 전송한다. • DirectStorage는 NVME storage를 억세스 하는 최적화된 API이다. Std File I/O보다 훨씬 효율적이라고 한다. • I/O는 비동기/병렬적으로 처리된다. • Storage에서 읽어서 메모리에 올릴 때 GPU기능을 이용해서 압축해제(일부 압축방식만 지원)하거나 CPU를 이용한 자체 포맷의 압축을 해제할 수 있다.
  • 5. • ID3D12Resource로 표현되는 모든 리소스에 대해 적용 가능. Texture, Vertex Buffer, Index Buffer등. 실질적으로는 Texture에 가장 많이 사용될 것으로 보인다. DirectStorage
  • 6.
  • 7.
  • 8.
  • 9. 샘플코드 분석 • microsoft/DirectStorage: DirectStorage for Windows is an API that allows game developers to unlock the full potential of high speed NVMe drives for loading game assets. (github.com) • DirectStorage/Samples/HelloDirectStorage/ • 기본적인 작동방법 • DirectStorage/Samples/MiniEngine/ModelViewer/ • 패키징 파일 만들기 • 로딩시 압축풀기 • Storage->D3D12Resource로 업로드
  • 11. 환경세팅 • NuGet package로 제공. • Solution Explorer->Manage NuGet Packages for solution -> Browse-> DirectStorage로 검색
  • 12. 파일 패키징 • 개별 파일을 하나하나 로드 하면 DirectStorage를 사용할 이유가 없다. • 각 파일에는 헤더가 붙어있고 sub resource 사이의 padding이 존재할 수 있기 때문에 원시 파일로는 배치처리를 할 수 없다. • 결국 데이터를 가공해야 한다. • 여러 개의 원시 파일의 헤더파트와 raw데이터 파트를 떼서 패키징 파일로 만든다. • 패키징 파일을 따로 만들고 offset으로 읽어 들이는 시점에서 DirectStorage를 사용하지 않아도 성능이 향상된다.
  • 13. #0 face_000.dds D3D12_RESOURCE_DESC Offset: 604 Data Size: 4096 #1 body_000.dds D3D12_RESOURCE_DESC Offset: 4700 Data Size: 16384 RAW DATA (0) RAW DATA (1) Count(3) #2 tree_001.dds D3D12_RESOURCE_DESC Offset: 21084 Data Size: 8192 RAW DATA (2) Packed File 200 Bytes 200 Bytes 200 Bytes 4096 Bytes 16384 Bytes 8192 Bytes 4 Bytes RAW DATA face_000.dds Data Size: 4096 RAW DATA body_000.dds Data Size: 16384 RAW DATA tree_001.dds Data Size: 8192 Source file Source file Source file
  • 14. DirectStorage를 이용한 File -> GPU 로딩 1. 패키징 파일이 몇 개의 데이터를 포함하고 있는지 개수를 얻는다. 2. 1에서 얻은 개수로 각 데이터의 헤더 파트의 메모리를 할당 3. 파일의 데이터(header data)-> 시스템 메모리의 DSTORAGE_REQUEST를 IDStorageQueue에 enqueue한다. 4. DirectStorage를 이용해서 File -> Memory로 헤더 파트를 batch 로딩. 5. 각 파일의 헤더 데이터를 참조하여 로딩의 목적지가 될 ID3D12Resource를 생성. 6. 파일의 데이터(raw data)-> GPU리소스의 DSTORAGE_REQUEST를 IDStorageQueue에 enqueue한다. 7. Submit하고 결과를 wait.
  • 15. #0 face_000.dds D3D12_RESOURCE_DESC Offset: 604 Data Size: 4096 #1 body_000.dds D3D12_RESOURCE_DESC Offset: 4700 Data Size: 16384 RAW DATA (0) RAW DATA (1) Count(3) #2 tree_001.dds D3D12_RESOURCE_DESC Offset: 21084 Data Size: 8192 RAW DATA (2) 3 Read
  • 16. #0 face_000.dds D3D12_RESOURCE_DESC Offset: 604 Data Size: 4096 #1 body_000.dds D3D12_RESOURCE_DESC Offset: 4700 Data Size: 16384 RAW DATA (0) RAW DATA (1) Count(3) #2 tree_001.dds D3D12_RESOURCE_DESC Offset: 21084 Data Size: 8192 RAW DATA (2) Read IDStorageQueue DSTORAGE_REQUEST Source: FILE; Destination:MEMORY Offset = 4 Size = 200*3 = 600 3 Read ID3D12Resource #0 ID3D12Resource #1 ID3D12Resource #2 Create D3DResources
  • 17. #0 face_000.dds D3D12_RESOURCE_DESC Offset: 604 Data Size: 4096 #1 body_000.dds D3D12_RESOURCE_DESC Offset: 4700 Data Size: 16384 RAW DATA (0) RAW DATA (1) Count(3) #2 tree_001.dds D3D12_RESOURCE_DESC Offset: 21084 Data Size: 8192 RAW DATA (2) Read IDStorageQueue (to Memory) DSTORAGE_REQUEST Source: FILE; Destination:MEMORY Offset = 4 Size = 200*3 = 600 3 Read ID3D12Resource #0 ID3D12Resource #1 ID3D12Resource #2 IDStorageQueue (to GPU) DSTORAGE_REQUEST Source: FILE; Destination: D3D12_RESOURCE Offset = 604 Size = 4096 DSTORAGE_REQUEST Source: FILE; Destination: D3D12_RESOURCE Offset = 4700 Size = 16384 DSTORAGE_REQUEST Source: FILE; Destination: D3D12_RESOURCE Offset = 21084 Size = 8192 Read
  • 18. 기존 엔진(자체 엔진)에 적용 • 텍스처 캐시로 적용 • 기존 텍스처 로딩 함수를 대체
  • 19. Resource Manager file name hash table face.dds body.dds tree.dds rock.dds LoadDDS() File Texture Manager LoadTextureFile(“body.dds”); 먼저 Hash table에서 찾아보고 해당 텍스처가 로드되어 있으면 ref count를 증가시키고 텍스처 데이터를 리턴
  • 20. Resource Manager File file name hash table face.dds body.dds tree.dds rock.dds LoadDDS() LoadTextureFile(“finger.dds”); finger.dds Texture Manager Hash table에 없으면 파일에서 읽고 hash table에 등록.
  • 21. 텍스처 캐시로 적용 • 텍스처 캐시는 DirectStorage를 사용하지 않아도 구현할 수 있다. • DirectStorage를 사용하면 최적화된 I/O성능을 제공하므로 텍스처 캐시의 로딩 시간을 줄일 수 있다. • 텍스처 캐시로 사용되는 GPU메모리가 낭비된다. • 그에 비해 성능 향샹은 미비할 수 있다. 전체 로딩 시간 중 텍스처 로딩이 얼마나 차지하는지가 중요.
  • 22. Resource Manager file name hash table face.dds body.dds tree.dds rock.dds LoadDDS() File Texture Manager 자주 사용하는 텍스처들을 초기화시 왕창 읽어서 미리 file name hash table에 등록해 둔다. Std file I/O 대신 DirectStorage를 사용하면 초기 텍스처 캐시 로딩 시간이 짧아진다. finger.dds Texture Cache Loader Std file I/O or DirectStorage
  • 23. 기존 텍스처 로딩 함수를 대체 • 텍스처 로딩 함수 호출시 IDStorageQueue에 enqueue만 해둔다. • 게임 루프중에 Submit/Wait 한다. 또는 enqueue중 일정 개수마다 submit/wait한다(내부적으로 Queue의 대기열이 절반 이상 차면 자동으로 submit한다고 한다). • 프로그래밍의 편리함 측면에서는 DirectStorage를 사용하는 쪽이 기존 방식보다 편할 수 있다. • D3D12에서는 DirectStorage를 사용하지 않는 기존 스타일이 프로그래밍하기에 더 복잡하다. • 대용량의 텍스처가 엄청나게 많은 경우가 아니면 실질적으로 성능 차이를 체감하기 어렵다.
  • 24. Resource Manager file name hash table face.dds body.dds tree.dds rock.dds LoadDDS() File Texture Manager 개별 텍스처 로딩 시 DirectStorage를 사용한다. 로딩함수 호출시에는 enqueue만 해 두고 일정 개수 씩 모아서 submit/wait한다. 개별 로딩 시간 단축. finger.dds Direct Storage Loader LoadTextureFile(“finger.dds”);
  • 25. 성능 비교 – texture cache 로딩 시간 std file I/O(Sync- Upload Buffer) std File I/O(Async- upload buffer) DirectStorage i7 8700K , SSD 970EVO+ RAID 1061.19 ms 925.92 ms 681.03 ms +26% EPIC 7v12 64 (Azure VM, HDD) 12861.29 ms 11613.92 ms 10846.57 ms +6% Surface Book 1(SSD) 2012.39 ms 1910.86 ms 1206.59 ms +36% (288MB textures)
  • 26. 결론 • 액면 그대로 ‘Storage-> GPU 메모리’ 로딩만 수행할 경우 분명한 성능 향상이 있다.(하지만 극적인 성능 향상은 아니다.) • 게임에서의 Loading이라고 하는 표현은 오만가지 종류의 작업을 포함한다. 따라서 텍스처 로딩 속도가 빨라진다고 해서 로딩 속도가 크게 향상된다고 보기는 어렵다. • 충분한 성능을 가진 PC에서는 더더욱 성능 향상이 적다. • D3D12에서 ‘파일 ->Upload Buffer -> GPU리소스’ 로 전송하는 단계를 비동기적으로 처리하려면 상당히 빡시다. 따라서 이렇게 처리하느니 Dstorage를 사용하는 편이 나을수도 있다(프로그래밍 편의상). • Sparse Virtual Texturing를 사용할 경우는 큰 성능향상이 있을지도 모른다(구현 안해봐서 확신할 수 없음)
  • 27. 결론 • 그래도 응용해볼 여지는 많이 있으니 추후 성공적인 사례가 나올지도? 열심히 시도해 보세요.
  • 28. 참고자료 • microsoft/DirectStorage: DirectStorage for Windows is an API that allows game developers to unlock the full potential of high speed NVMe drives for loading game assets. (github.com) • DirectStorage/DeveloperGuidance.md at main · microsoft/DirectStorage (github.com) • D3D12 리소스 관리 전략(https://youtu.be/lHlAloRa-HI)