2012-05-14 10 views
1

この質問はXNAの実装に関するものですが、もっと一般的なC#フォーラムには適していると思います。私は、ユーザに読み込み画面を提示しながら、追加のリソースを初期化するためにXNAでTaskFactoryを使用しています。コードは次のようになります。XNAのTaskFactory実行時にループ内でテクスチャにSetDataを実行するとき

 Task.Factory.StartNew(() => DoSomeInitialStuff()) 
      .ContinueWith((x) => BuildALevel(x.Result)) 
      .ContinueWith((x) => DoSomeFinalizingStuff(x.Result)) 
      .ContinueWith((x) => NotifyThatIAmFinished()); 

私は必要な時間を記録している、と私のメインウィンドウにフォーカスがあるときに私のDoSomeFinalizingStuff方法は時間がかかります。 DoSomeFinalizingStuffは、SetDataメソッドを使用して実際に400x400のTexture2D(プロセスに表示されず、作成および変更された)に書き込みます。 〜しないフォーカス(および見えない)で撮影した(時間に10K +まで)5000ms AVG時間:〜測定100msの

時間の実際の実行時間である焦点で可視取り込ま

AVG時間DoSomeFinalizingStuff。 AVGで50倍の違いがありますが、私はかなり面倒です。なぜそうですか?

デバッガを実行しているときは、すべての連鎖されたタスクが共に1秒で完了する必要があります。デバッグやインタラクションなしで実行すると、処理速度が大幅に遅くなります。通常、ローディング画面はその完了まで約10〜15秒間表示されます。

メインウィンドウからフォーカスを離したときにタスクをより高速に実行できるようにすることができます。私が離れたところで、関数が実行されます。

私がSetData()呼び出しを削除した場合、パフォーマンスはデバッグ時と同じですが、ウィンドウズは非アクティブです。

なぜこれが起こっているのですか?この動作を変更する方法はありますか?

+0

補足として、 'x'の前後にかっこは必要ありません。 – svick

+0

その間何が起こったのですか?タスクは実際に実行されているか、実行待ちですか?実行している場合、正確には何をしていますか? – svick

+0

@svickタスクが実行され、既存のTexture2dに書き込みます。 (F5キーを押して完了まで待つ)操作は常に同じで、デバッグ時(または別のウィンドウをクリックしてVSをフォアグラウンドにするなど)は15秒以下で、メソッドでSystem.Debugの呼び出しを追加し、この動作をログに記録したので、私は知っています。 – UrbanEsc

答えて

0

同期の問題があるようです。

一つ可能原因はContinueWithは(あなたがTaskScheduler.FromCurrentSynchronizationContext()で初期化されたスケジューラでタスクから実行した場合、それはあまりにもそれを持っています)TaskSchedulerを継承していることです。 ContinueWithContinueWith(...,TaskScheduler.Default)というように呼び出してみてください。

そうでない場合は、デバッグ中に 'Parallel Tasks'や他のスレッド関連のウィンドウを調べてみてください。問題の特定に役立つかもしれません。

+0

私は試みましたが、私の問題は解決しませんでした。 – UrbanEsc

+0

@UrbanEscまあ、それはただの原因だった。 (そして、通常、デッドロックを引き起こし、減速ではありません。)とにかく、私は99.9999%のTPLがここに責任を負うことはないと確信しています。がんばろう。 – Dmitry

+0

私は責任がありません:)あなたが正しいかもしれない、私が観察している行動は正しいかもしれませんが、私はなぜそれを理解する必要があります。メインスレッド、ゲームは、これらのUpdate()とDraw()の呼び出しで忙しいようですが、それがTPLが私の仕事に低優先度を与える理由かもしれませんか? – UrbanEsc

関連する問題