Metal资源“Purgeable State”机制疑问:GPU命令执行时设Empty的影响及释放方法
MTLBuffer可清除状态与GPU未完成命令的问题解答
1. GPU有未完成命令时设置MTLPurgeableStateEmpty的行为
当GPU存在已排队或正在执行的、读取my_buffer的渲染命令时,调用[my_buffer setPurgeableState:MTLPurgeableStateEmpty]不会中断GPU工作:
- GPU会正常完成所有已提交的依赖该buffer的命令,不会出现无法识别buffer或渲染错误的情况
- 只有当所有相关GPU命令执行完毕后,buffer的内存才会被真正标记为可回收,此时buffer的内容会被清空
2. purgeableState对设备内存分配的影响
purgeableState直接管控GPU设备内存的占用:
- 当状态为
MTLPurgeableStateNonVolatile或MTLPurgeableStateVolatile时,buffer的内存会被持续占用,系统不会主动回收 - 切换到
MTLPurgeableStateEmpty后,buffer的内存会被标记为可释放,一旦GPU不再引用它,系统就会回收这部分内存,降低设备内存占用
3. 自动释放无未完成引用命令的buffer内存(无需感知命令状态)
如果不想手动管理命令完成状态,推荐利用Metal的自动可清除机制:
- 将buffer的可清除状态设置为
MTLPurgeableStateVolatile:系统会自动跟踪该buffer的GPU使用链路,当所有依赖它的GPU命令执行完成后,自动将其内存标记为可回收,无需手动调用setPurgeableState: - 若之后需要重新使用该buffer,需先检查其状态,若已被清空,需要重新填充数据
内容的提问来源于stack exchange,提问作者BENG
相关产品推荐
相关产品推荐

