D3D12之资源管理

本文详细介绍了D3D12中资源管理的流程,包括从磁盘加载到GPU执行的各个步骤,并讨论了资源创建的阻塞与非阻塞方式。资源管理的核心在于减少创建和销毁的次数,以优化游戏性能。同时,文章提到了资源的托管和非托管管理,强调了GPU处理完毕后销毁资源的原则,以及面对内存泄漏的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

D3D12的资源管理已经移交到上层应用了,为此我们需要自己做资源管理,我们先来看一下一个资源从创建到销毁需要经过哪些步骤:

  1. 磁盘的文件读取,不同的资源有自己的文件格式,其中还可能涉及文件的压缩,因此一个文件首先要从磁盘加载到内存,然后解压缩,解析,最后再转换成显卡识别的内存布局。
  2. 申请上传堆或者默认堆的内存空间,也就是创建ID3D12Resource资源。
  3. 接下来使用memcpy函数将资源上传到驱动内存(cpu和gpu共享的内存)。
  4. 将资源通过PCIE总线上传到默认堆。
  5. 创建资源的View,也就是通过资源描述符告诉显卡这个内存里面存的是什么,内存布局是怎样的
  6. 将资源的View设置到根参数中,资源与Shader绑定
  7. 设置围栏来侦测资源是否已经被显卡使用完毕
  8. 调用DrawCall使用资源
  9. 上传指令
  10. GPU执行Shader
  11. 销毁资源

从上面的过程中我们可以看到,一个资源其实占用多份内存,比如最先读取的压缩资源,解析后的资源,上传堆中的资源,默认堆中的资源。我们在做资源管理的时候不仅要考虑最终的资源,还要考虑中间生成的临时资源。对于资源的生命周期是逻辑决定的,比如这个资源已经没有Pass使用了,那么我们是否需要销毁它呢?从正确性的角度这个资源已经没有用了,完全可以销毁,但是从逻辑的角度来说下一帧还会用到这个资源,那这个资源是不是应该销毁呢?假如内存和显存足够大,我们其实完全没有必要销毁资源,可是往往我们做的游戏都是在有限的资源里面运行超额的数据,因此所谓资源管理的本质就是尽量减少资源创建和销毁的次数,保证游戏能够正常运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值