# 引用
[1] 游戏引擎编程实战 https://zhuanlan.zhihu.com/p/424785264
[2] DirectX123D 游戏开发实战
[3] Direct12 入门学习 https://zhuanlan.zhihu.com/p/352433339 [toc]
# 资源
# Resource
D3D 使用资源来统一表示 GPU资源
,不管是一块 Buffer 还是一张 texture。
GPU 不与渲染管线直接绑定,而是通过 描述符(Descriptor)
作为中间对象来绑定。
# Descriptor/View
视图与描述符是同义词 描述符,实际上 D3D 中的大部分对象的创建都需要通过描述符来设置,如
- 命令队列 - 命令列表 - 命令分配器 - 资源 - 交换链
描述资源分配
- 描述符堆
描述符堆存放的是多个描述符在同一块内存中的分布,主要用于描述一个渲染管线内所需要的描述符集合.
- Root Signatures
![Image Uploading…]
# Heap
GPU资源都存放在资源堆中
H,eap 是一块连续的显存块。 堆分为以下几种类型:
- 默认堆 - 上传堆 - 回读堆
# 显存分配接口和方案
# 接口 - CommittedResource
ID3D12Device::CreateCommittedResource : 申请显存资源 Resource 会映射到这个堆上。
# 接口 - PlacedResource
- 调用 ID3D12Device::CreateHeap 显示分配一个比较大的 Heap
- 调用 ID3D12Device::CreatePlacedResource 在 Heap 中分配一小段空间给 Resource
注意:
PlacedResource 可以重叠,但是不能同时访问
# 接口 - ReservedResource
# 方案 - StandAlone
即一个资源对应一个 Resource 对象接口
缺点是如果存在大量分配显存需求时,存在很大的性能消耗
# 方案 - SubAllocation
# 方案 - Circular Buffer
又称
ring buffer
# 方案 - Segregated Free Lists
类似于段页式管理
# 方案 - Buddy System
核心逻辑 (1)分配的时候,如果空闲的显存块太大,会对其不断二分(被分割的两块显存之间就是 Buddy),分割到再分割就会小于所需空间为止。
(2)释放的时候,会检测 Buddy 是否是空闲的,是的话就会和 Buddy 合并成一个大的空闲块。如果这个合并之后的大空闲块发现它的 Buddy 也是空闲的,那么会继续合并,直到无法合并为止。 缺点是碎片化