2011年6月19日日曜日

Generating and Reading Data

Generating Data

前に示したように、データを生成するProduction nodeを、「Generator」と呼びます。
Generatorの生成後は、アプリケーションによる設定が必要となる場合があるため、
即座にデータの生成を開始するわけではありません。

このことは、アプリケーション提供されるデータは、アプリケーションによる設定に従って生成されていることを保証します。

Generatorは、データを生成するよう指示されるまで、データを生成しません。

xn::Generator::StartGenerating() 関数は、データ生成を開始するのに使用します。
また、アプリケーションは、xn::Generator::StopGenerating()を使用することで、nodeを破棄せずにデータ生成を中断し、nodeの設定を変更することができます。

Reading Data
Data Generatorは、連続的に新しいデータを生成します。
しかし、アプリケーションは、古いデータもまた使用可能です。(たとえば、深度マップの前のフレームデータなど)
この結果として、generatorは、新しいデータの取得を明示的に指示されるまで、新しいデータを内部的に保持します。
このことは、アプリケーションが「UpdateData」関数によって明確に指示するまで、Data Generatorは新しいデータを内部に隠していることを意味します。
OpenNIは、xn::Generator::WaitAndUpdateDate()関数によって、新しいデータが取得可能になるまで、アプリケーションを待機させることができます。

あるケースでは、アプリケーションは1つ以上のnodeを持ち、すべてのnodeのupdateが必要になることがあります。
OpenNIはこれを行うための関数をいくつか用意しています。
これらの関数の違いは、UpdateAllの引き金となるイベントの違いです。
・xn::Context::WaitAndUpdateAll()
待機中のnodeの1つで新しいデータが取得可能になったとき、すべてのnodeをupdateする
・xn::Context::WaitOneUpdateAll()
ある特定の1つのnodeを監視し、そのnodeの新しいデータが取得可能になったとき、すべてのnodeをupdateする。これは、複数のnodeがあるが、そのうちの1つのnodeがアプリケーションの進行を決定する場合に有効です。
・xn::Context::WaitNoneUpdateAll()
待機せずに、即座にすべてのnodeをupdateします。
・xn::Context::WaitAndUpdateAll()
すべてのnodeを待機し、すべてのnodeで新しいデータが取得可能になったら、updateします。

上記の4つの関数は、2秒のタイムアウト後に終了します。
ある特定のnodeのみupdateする必要がある場合を除いて、通常はxn::Context::Wait[...]UpdateAll()関数を使用することを強く推奨します。
すべてのnodeをupdateすることは、以下の点で有益です。
・nodeが相互に依存している場合、目的のnode(アプリケーションがupdateしたいnode)が依存しているnode(このnodeは、より低レベルなnodeで、他のnodeにデータを供給するnodeです。)が、updateされた後に、目的のnodeがupdateされることを保証します。
・記録からデータを再生している場合、条件に合致するまで再生を続けます。
・recorderが存在する場合、この関数は自動的にrecorderの対象となるnodeからの記録を始めます。


Mock Nodes

OpenNIはnodeのMock実装をサポートします。
nodeのMock実装は、データの生成ロジックを一切含みません。
代わりに、(アプリケーションや、他のnode実装などの)外部コンポーネントに対して設定変更やデータを与えることを可能にします。
アプリケーションがMock nodeを必要とするケースはまれです。
ただ、データ再生を行うnodeが、データ読み込みの際に、実際のnodeをシミュレートする場合は有用です。

0 件のコメント:

コメントを投稿