DirectX媒体对象(DMO)documentation建议,为了提高效率,应该汇集持有媒体样本(支持IMediaBuffer
接口)的缓冲区而不是不断创建/销毁:
最简单的解决方案是为每个样本分配一个新缓冲区,尽管这样做效率很低。
更好的解决方案是实现一个对象来管理池 缓冲区。为此,请在您的Release方法中编写代码 IMediaBuffer实现调用缓冲区管理器的方法 当引用计数降至零时(而不是删除自身)。 然后,缓冲区管理器可以维护指定的分配列表 缓冲对象。在缓冲区管理器中创建一个方法来检查 自由缓冲区列表并返回一个指针,以便您的应用程序可以 需要时访问缓冲区。
现在DMO已被Media Foundation Transforms(MFT)取代,我在文档中找不到相同的建议。 在管理等效缓冲区对象时(这次实现IMFMediaBuffer
接口),这个池化策略是否仍应考虑?
答案 0 :(得分:3)
汇集策略仍然会降低整体性能开销,但需要记住一些重要事项:
MFCreateSample
等功能级API实现池化:API返回在API管理的内部样本对象池上创建的新样本也就是说,即使你没有汇集,你仍然可以免费获得一些池,而API本身可以帮助你处理这样的小事。当然,合理的资源管理方法仍然有意义并且不会受到影响,尤其是文档在如何进行优化方面并没有那么详细。
另外,COM对象池实现的一个很好的例子是DirectShow的CMemAllocator
实现,它包含在\ Samples \ multimedia \ directshow \ baseclasses \ amfilter.h
答案 1 :(得分:2)
请参阅此网络广播:Introduction to Windows Media Architecture
您将在MediaFoundation中了解有关内存管理的更多信息。
根据我对MediaFoundation的体验,MediaFoundation汇集策略非常好。