3D モデリング アプリケーション用のプラグインを開発しています。このアプリケーションには、自動化したいサードパーティのプラグイン (レンダリング エンジン) もあります。
私がしているのは、 Camera のリストを作成しList<Camera> cameraViews
、それらすべてを繰り返し処理し、レンダリングエンジンにレンダリングを開始するように指示することです
foreach ( Camera camera in cameraViews )
{
// tell the modellingApplication to apply camera
modellingApplication.ApplyCameraToView(camera);
// tell the render engine to render the image
string path = "somePathWhereIWantToSaveTheImage"
renderEngine.renderCurrentScene(path)
// .renderCurrentScene() seems to be async, because my code, which is on the UI thread
// continues... so:
// make sure that the image is saved before continuing to the next image
while ( !File.Exists(path) )
{
Thread.Sleep(500);
}
}
ただし、これは機能しません。renderplugin は非同期処理を行っているように見えますが、この非同期処理を行うとき、情報を取得するためにメイン スレッドを呼び出しています。
これに対する回避策を見つけました。レンダリング エンジンを呼び出してレンダリングした直後に、MessageBox を呼び出します。これにより、コードの続行がブロックされますが、非同期呼び出しは引き続き処理されます。私は知っています、これは奇妙な振る舞いです。さらに奇妙なのは、renderengine が情報を得るために UI スレッドの呼び出しを完了し、独自のプロセスを続行すると、MessageBox が自動的に閉じられるという事実です。イメージがディスクに保存されているかどうかを確認するために、コードを while ループに継続させます。
foreach ( Camera camera in cameraViews )
{
// tell the modellingApplication to apply camera
modellingApplication.ApplyCameraToView(camera);
// tell the render engine to render the image
string path = "somePathWhereIWantToSaveTheImage"
renderEngine.renderCurrentScene(path)
// .renderCurrentScene() seems to be async, because my code, which is on the UI thread
// continues... so:
// show the messagebox, as this will block the code but not the renderengine.. (?)
MessageBox.Show("Currently processed: " + path);
// hmm, messagebox gets automatically closed, that's great, but weird...
// make sure that the image is saved before continuing to the next image
while ( !File.Exists(path) )
{
Thread.Sleep(500);
}
}
メッセージボックスの部分を除けば、これは素晴らしい。メッセージボックスを表示したくありません。スレッド全体をブロックせずにコードを一時停止したいだけです (renderengine から ui スレッドへの呼び出しは引き続き受け入れられるため)。
レンダリング エンジンが非同期で作業を行わなければ、はるかに簡単だったでしょう..