我还应该汇集IMFMediaBuffer对象吗?

时间:2016-09-05 19:32:52

标签: c++ ms-media-foundation

DirectX媒体对象(DMO)documentation建议,为了提高效率,应该汇集持有媒体样本(支持IMediaBuffer接口)的缓冲区而不是不断创建/销毁:

  

最简单的解决方案是为每个样本分配一个新缓冲区,尽管这样做效率很低。

     

更好的解决方案是实现一个对象来管理池   缓冲区。为此,请在您的Release方法中编写代码   IMediaBuffer实现调用缓冲区管理器的方法   当引用计数降至零时(而不是删除自身)。   然后,缓冲区管理器可以维护指定的分配列表   缓冲对象。在缓冲区管理器中创建一个方法来检查   自由缓冲区列表并返回一个指针,以便您的应用程序可以   需要时访问缓冲区。

现在DMO已被Media Foundation Transforms(MFT)取代,我在文档中找不到相同的建议。 在管理等效缓冲区对象时(这次实现IMFMediaBuffer接口),这个池化策略是否仍应考虑?

2 个答案:

答案 0 :(得分:3)

汇集策略仍然会降低整体性能开销,但需要记住一些重要事项:

  1. 随着时间的推移,池化的重要性随着时间的推移而变得越来越小,即使在像实时视频处理这样对性能敏感的API上也会越来越小
  2. Media Foundation为MFCreateSample等功能级API实现池化:API返回在API管理的内部样本对象池上创建的新样本
  3. 也就是说,即使你没有汇集,你仍然可以免费获得一些池,而API本身可以帮助你处理这样的小事。当然,合理的资源管理方法仍然有意义并且不会受到影响,尤其是文档在如何进行优化方面并没有那么详细。

    另外,COM对象池实现的一个很好的例子是DirectShow的CMemAllocator实现,它包含在\ Samples \ multimedia \ directshow \ baseclasses \ amfilter.h

    中的Windows SDK 7.x示例中。

答案 1 :(得分:2)

请参阅此网络广播:Introduction to Windows Media Architecture

您将在MediaFoundation中了解有关内存管理的更多信息。

根据我对MediaFoundation的体验,MediaFoundation汇集策略非常好。