知识卡片

复用对象比反复申请释放更高效,但要小心尺寸退化

专业/工作 · 110.a.1

内容

命令缓冲区从池中分配、释放回池是较重的操作;如果预知会反复录制相似的命令序列(比如每帧渲染),更好的做法是重置命令缓冲区而不是释放后重新分配——重置只是把它恢复到初始状态,但保留它已经动态申请到的底层内存,避免下次录制时重新申请,这是典型的对象池复用思路,呼应[[内存分配策略没有放之四海而皆准的答案]]里”批量/池化优于逐次申请”的原则。但这里有一个隐藏陷阱:如果同一批命令缓冲区被反复用来记录时大时小的命令序列,由于底层资源只增不减,所有命令缓冲区最终都会膨胀到和历史上最复杂的那次一样大。应对办法是保持每个命令缓冲区的用途稳定(不要混用精简和复杂的场景),或周期性地在重置时显式要求释放多余资源。这提醒了一个更通用的教训:复用型对象池如果不设收缩机制,长期运行后的内存占用会被历史峰值锁定。

参考来源

《Vulkan 应用开发指南》第3章《队列和命令》