DirectX媒体对象(DMO) 文档建议,为了提高效率,保存媒体示例(支持IMediaBuffer接口)的缓冲区应该集合起来,而不是不断地创建/销毁:
最简单的解决方案是为每个示例分配一个新的缓冲区,尽管这样做效率很低。 更好的解决方案是实现一个对象来管理缓冲区池。要做到这一点,请在IMediaBuffer实现的发布方法中编写代码,该方法在引用计数降到零时调用缓冲区管理器的方法(而不是删除自身)。然后,缓冲区管理器可以维护指向分配的缓冲区对象的指针列表。在缓冲区管理器中创建一个方法来检查空闲缓冲区列表并返回一个指针,以便应用程序可以在需要时访问缓冲区。
既然DMO已经被(MFT)所取代,我在文档中找不到同样的建议。这种池策略在管理等效的缓冲区对象(这次是实现IMFMediaBuffer 接口)时仍然需要考虑吗?
发布于 2016-09-05 20:24:22
池策略仍然可以减少总体性能开销,但是有几件重要的事情要记住:
MFCreateSample)在其一侧实现池:API返回在API管理的示例对象内部池上创建的新示例。也就是说,即使您没有池,您仍然可以免费获得一些池,并且API本身可以帮助您处理这样的小事情。您正确管理资源的合理方法仍然是有意义的,当然也不会有什么害处,特别是文档并没有详细说明它是如何在其结束时进行优化的。
另外,COM对象池实现的一个很好的例子是\Samples\multimedia\directshow\baseclasses\amfilter.h中包含在WindowsSDK7.x示例中的DirectShow的CMemAllocator实现
发布于 2016-09-10 19:23:38
请参阅以下网播:Windows媒体体系结构简介
您将了解有关MediaFoundation内部内存管理的更多信息。
就我使用MediaFoundation的经验而言,MediaFoundation池策略非常好。
https://stackoverflow.com/questions/39336662
复制相似问题