2

XNA Game Studio 4.0 で公式の Kinect SDK 1.6 を使用しています。

次の代わりに、すべてのフレームを一度にポーリングできるようにするための優れた回避策があるかどうかを知りたいです。

ColorImageFrame cFrame = _Device.ColorStream.OpenNextFrame(100);
DepthImageFrame dFrame = _Device.DepthStream.OpenNextFrame(100);
SkeletonFrame sFrame = _Device.SkeletonStream.OpenNextFrame(100);

ループ内で 3 つの同期呼び出しを行いたくありません。私は本当に何かを望んで_Device.OpenAllFrames(100)いましたが、ポーリングメソッドの AllFramesReady イベントに相当するものはないようです。

XNA にあまり適していないため、イベント ドリブン方式に切り替えることはできません。または、XNA のループ内で Kinect のストリームにアクセスするためのより良い方法を誰かが持っていますか?

4

1 に答える 1

1

SDK の上に独自のシンプルな Kinect マネージャーを作成することをお勧めします (これは、私のプロジェクトの 1 つで行ったことです)。

このマネージャーは、深さ、色、およびスケルトン ストリームからのイベントをリッスンし、最新の利用可能なフレームをいくつかのローカル変数に保存するだけのシングルトン オブジェクトである可能性があります (必要でない場合は、いくつかのストリームを最適化して無効にすることもできます)。

XNA ゲーム ループでこれらの変数にアクセスすると、最新のフレームが利用可能になります。マネージャーが変数に書き込んでいる間に変数を読み取らないようにするために、いくつかのスレッド同期が必要になります。

この機能に加えて、このマネージャーは、Kinect センサーが切断/再接続された場合の処理​​にも役立ちました。センサーが接続されているかどうかを常にテストする代わりに、マネージャー オブジェクトは常に存在しますが、新しいフレームがローカルに保存されることはありません。

もちろん、何か特別なことをしたい場合に備えて、XNA ゲームは引き続き切断/接続イベントを処理できますが、ゲーム ループでは、有効な kinect センサーが接続されているかどうかを常にテストする必要はありません。

于 2013-05-25T20:19:24.957 に答える