2016-09-05 8 views
3

のDirectXメディアオブジェクト(DMO)documentationは、効率のために、(IMediaBufferインタフェースをサポートする)培地試料を保持するバッファが代わりに常に破壊/作成されるのでプールされるべきである、ということをお勧め:IMFMediaBufferオブジェクトをプールする必要がありますか?

最も簡単な解決策はです各サンプルに新しいバッファを割り当てますが、これは非効率的です。

より良い解決策は、 バッファのプールを管理するオブジェクトを実装することです。これを行うには、参照カウントが0になったときに、自分自身を削除する代わりに というバッファマネージャのメソッドを呼び出す IMediaBuffer実装のReleaseメソッドにコードを記述します。 バッファマネージャは、 バッファオブジェクトに割り当てられたポインタのリストを保持できます。バッファマネージャにメソッドを作成して、空きバッファのリストを確認し、必要に応じてアプリケーションに のアクセスができるようにポインタを返します。

DMOがMedia Foundation Transforms(MFT)に置き換えられたので、私はドキュメントで同じアドバイスを見つけることができません。 同等のバッファオブジェクトを管理するときに考慮する必要のあるこのプーリング戦略(今度はIMFMediaBufferインターフェイスを実装する)ですか?

答えて

3

プーリング戦略はまだ全体的なパフォーマンスのオーバーヘッドが減少しますが、心に留めておくべきいくつかの重要な事があります。

  1. プーリングないの影響は、このような上にもますます小さくなるにつれて、時間とともに減少するプーリングの重要性リアルタイムのビデオ処理などのパフォーマンスに敏感なAPI
  2. メディア財団がMFCreateSampleのような関数レベルのAPIのためにその側にプールを実装:APIは、サンプルオブジェクト
01のAPI管理の内部のプールに作成された新しいサンプルを返します。

プールしていなくても、まだ無料でプールができていて、API自体がこのような小さなことに役立ちます。正確なリソース管理のためのあなたの妥当なアプローチは、理にかなっています。もちろん、ドキュメントの最終的な最適化の仕方について詳しくは書かれていません。

はまた、COMオブジェクトプールの実装の良い例は、\試料中のWindows SDK 7.xのサンプルに含まれるのDirectShowのCMemAllocator実装です\マルチメディアの\ DirectShowの\ baseclasses \

+0

これをクリアしていただきありがとうございます。私はDMO対応のアプリケーションをMFに移行する過程にあり、バッファプールをスクラップするか、MFバッファを再設計する必要があるかどうかは不明でした。 =) – BlueStrat

2

amfilter.hこのウェブキャストを参照してください:Introduction to Windows Media Architecture

MediaFoundation内のメモリ管理の詳細を学習します。

MediaFoundationでの私の経験では、MediaFoundationのプーリング戦略は非常に優れています。

関連する問題