일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- I/O장치
- 백준
- 그리디알고리즘
- 프로그래머스
- 타입 객체
- 컨디션 변수
- directx
- 쓰레드
- 알고리즘
- 동적계획법
- 다이나믹 프로그래밍
- 그리디 알고리즘
- DirectX 12
- Direct12
- 멀티프로세서
- codility
- 락
- 자료구조
- OS
- 렌더링 파이프라인
- DirectX12
- 다이나믹프로그래밍
- 병행성
- 운영체제
- 멀티쓰레드
- 디자인패턴
- 스케줄링
- 병행성 관련 오류
- 영속성
- 파일시스템 구현
- Today
- Total
기록공간
[DirectX 12] 기본지식 - 상주성(Residency) 본문
복잡한 게임은 텍스처, 3차원 메시 등 수많은 자원을 사용한다. 그런데 그 자원들 중 항상 GPU에 필요한 것은 많지 않다.
예를 들어 야외의 숲과 숲 속에 있는 큰 동굴을 배경으로 한 게임을 생각해 보자. 동굴을 표현하는 데 쓰이는 자원은 플레이어가 동굴에 들어가기 전까지는 필요하지 않으며, 또한 동굴에 들어가면 숲의 자원은 필요하지 않다.
Direct3D 12에서 응용 프로그램은 자원을 GPU 메모리로 부터 내림('퇴거')으로써, 그리고 필요한 경우 다시 GPU에 올림('입주')으로써 자원의 상주성을 관리한다. (상주성이란, 자원이 GPU 메모리에 들어 있는지에 대한 여부이다.)
상주성 관리의 핵심은 응용 프로그램이 사용하는 GPU 메모리의 양을 최소화하는 것이다. 전체 게임에 필요한 자원들을 모두 GPU 메모리에 담지 못할 수 있으며, 사용자의 다른 응용 프로그램이 GPU 메모리를 사용해야 할 수도 있으므로, 상주성 관리가 꼭 필요하다.
성능 측면에서 한가지 주의해야 할 점은 응용 프로그램은 같은 자원을 짧은 시간에 GPU 메모리에 넣었다 뺐다하는 상황은 피해야 한다. 그런 활동을 자주하면 비용이 많이 들기 때문이다. 이상적인 경우는, 한동안 사용하지 않을 자원들만 GPU 메모리에서 내려야 한다. 적합한 예로는 게임의 레벨이나 지역이 바뀌는 시점을 들 수 있다.
기본적으로, 자원을 생성하면 자원이 GPU 메모리에 입주하며, 파괴되면 메모리에서 나간다. 하지만 다음 메서드들을 이용하여 상주성을 직접 제어할 수도 있다.
HRESULT ID3D12Device::MakeResident (
UINT NumObjects;
ID3D12Pageable *const *ppObjects);
HRESULT ID3D12Device::Evict(
UINT NumObjects;
ID3D12Pagealble *const *ppObjects);
NumObjects 매개변수는 자원들의 개수이고, ppObjects 매개변수는 ID3D12Pageable 자원들의 배열이다.
'DirectX > 기초' 카테고리의 다른 글
[DirectX 12] 기본지식 - CPU / GPU 동기화 (0) | 2020.02.19 |
---|---|
[DirectX 12] 기본지식 - 명령 대기열(큐)과 명령 목록(리스트) (4) | 2020.02.12 |
[DirectX 12] 기본지식 - DXGI(DirectX Graphics Infrastructure) (0) | 2020.02.05 |
[DirectX 12] 기본지식 - 기능 수준(Feature Level) (0) | 2020.02.05 |
[DirectX 12] 기본지식 - 다중 샘플링(Multisampling) (5) | 2020.02.05 |