# 引用

[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

在已经分配好内存的 Heap 中再分配一段小的

  • 调用 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 也是空闲的,那么会继续合并,直到无法合并为止。 缺点是碎片化

# 命令分配器、命令列表以及命令队列

三者之间的关系大概如下图: