我还应该合并 IMFMediaBuffer 对象吗?
Posted
技术标签:
【中文标题】我还应该合并 IMFMediaBuffer 对象吗?【英文标题】:Should I still pool IMFMediaBuffer objects? 【发布时间】:2016-09-05 19:32:51 【问题描述】:DirectX 媒体对象 (DMO) documentation 建议,为了提高效率,保存媒体样本(支持 IMediaBuffer
接口)的缓冲区应该被池化,而不是不断地创建/销毁:
最简单的解决方案是为每个样本分配一个新的缓冲区,尽管这样做效率很低。
更好的解决方案是实现一个对象来管理一个池 为此,请在您的 Release 方法中编写代码 调用缓冲区管理器方法的 IMediaBuffer 实现 当引用计数降至零时(而不是删除自身)。 然后缓冲区管理器可以维护一个指向已分配指针的列表 缓冲对象。在缓冲区管理器中创建一个方法来检查 空闲缓冲区列表并返回一个指针,以便您的应用程序可以 需要时访问缓冲区。
现在 DMO 已被 Media Foundation Transforms (MFT) 取代,我在文档中找不到相同的建议。 在管理等效缓冲区对象时(这次实现IMFMediaBuffer
接口)是否仍应考虑这种池化策略?
【问题讨论】:
【参考方案1】:池化策略仍可降低整体性能开销,但需要牢记一些重要事项:
-
即使在实时视频处理等对性能敏感的 API 上,由于不进行池化的影响越来越小,池化的重要性也会随着时间的推移而降低
Media Foundation 为
MFCreateSample
等函数级 API 实现池化:API 返回在 API 管理的内部样本对象池上创建的新样本
也就是说,即使您不进行池化,您仍然可以免费获得一些池化,并且 API 本身可以帮助您处理诸如此类的小事。当然,您进行准确资源管理的合理方法仍然有意义并且不会受到伤害,尤其是文档并没有详细说明它是如何进行优化的。
此外,COM 对象池实现的一个很好的例子是 DirectShow 的 CMemAllocator
实现包含在 \Samples\multimedia\directshow\baseclasses\amfilter.h 中的 Windows SDK 7.x 示例中
【讨论】:
太好了,感谢您解决这个问题。我正在将启用 DMO 的应用程序迁移到 MF 并且不确定是否应该废弃缓冲池或围绕 MF 缓冲区重新设计它。 =)【参考方案2】:观看此网络广播:Introduction to Windows Media Architecture
您将在 MediaFoundation 中了解有关内存管理的更多信息。
就我使用 MediaFoundation 的经验而言,MediaFoundation 池化策略非常好。
【讨论】:
以上是关于我还应该合并 IMFMediaBuffer 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章
我还应该在 VueJS 中使用 jQuery 来制作动画吗?