この質問は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()呼び出しを削除した場合、パフォーマンスはデバッグ時と同じですが、ウィンドウズは非アクティブです。
なぜこれが起こっているのですか?この動作を変更する方法はありますか?
補足として、 'x'の前後にかっこは必要ありません。 – svick
その間何が起こったのですか?タスクは実際に実行されているか、実行待ちですか?実行している場合、正確には何をしていますか? – svick
@svickタスクが実行され、既存のTexture2dに書き込みます。 (F5キーを押して完了まで待つ)操作は常に同じで、デバッグ時(または別のウィンドウをクリックしてVSをフォアグラウンドにするなど)は15秒以下で、メソッドでSystem.Debugの呼び出しを追加し、この動作をログに記録したので、私は知っています。 – UrbanEsc