我还应该合并 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 来制作动画吗?

使用C++代码直接在IMFMediaBuffer上画一个矩形

spring 中的验证器应该访问数据库吗?

你还应该在单元测试中进行内存管理吗? (OCUnit)

在合并列函数中应用 *args 并指示字符串值

当我使用 Git 时,我应该在合并之前重新设置基准吗?