1

XNA 4.0 でのタイミングに問題があり、C# で記述し、Visual Studio 2010 Express を使用しています。

私はゲームを正確に書いているわけではありませんが、単純化されたコンテンツ パイプライン、描画、およびタイミングのために XNA を使用しようとしています。私がやろうとしているのは、画面上の刺激に対するユーザーの応答を非常に細かい解像度 (理想的には 5 ミリ秒未満) で計ることができるプログラムを作成することです。

これを行うには、少なくとも 5 ミリ秒ごとに更新ルーチンを呼び出す必要があります (キーボードをポーリングできるようにするため)。可変ステップ タイミングでも、1 回の呼び出しで約 16 ms 以下のタイミングを取得できません。これは、更新ルーチンと描画ルーチンで行う処理量とは関係がないようです。両方のルーチンのすべてをコメントアウトできますが、プログラムは各反復で約 16.66 ミリ秒を費やしています。

固定ステップ タイミングでは、ターゲットを 1 秒あたり約 60 回の反復 (更新間で 16.66 ミリ秒) に設定できますが、それよりも速く行おうとすると、IsRunningSlowly フラグが作動し、ゲームは補正しようとするようです。反復は 1 秒あたり 60 回よりも速く実行され、1 回の反復は遅くなります。

私の質問はこれだと思います: 1 秒あたり 60 回の反復が XNA の上限ですか? それを回避することは可能ですか?XNAを完全に捨てる必要がありますか?

あなたの時間と知識に本当に感謝しています。前もって感謝します。

4

2 に答える 2

2

あなたが抱えている問題は、VSync が原因です。ゲームのコンストラクターに次の行を追加して、XNA で無効にします (既定の があると仮定しますGraphicsDeviceManager graphics)。

graphics.SynchronizeWithVerticalRetrace = false;

これにより、ゲームを「できるだけ速く」実行できます。これは、目的には「十分」である必要があります。

XNA でのタイミングの説明については、このブログ投稿を参照してください。

もっと派手にしたい場合: Windows 上の XNA の場合、Windows イベント ループと高解像度タイマーを直接使用することを検討します。GameXNA (Windows および Xbox 360) では完全にオプションであることに注意してください。

遅い操作 (例: update と draw) とブロッキング操作 (例: vsync) をメイン スレッドからできるだけ多く移動する必要があります。XNA での入力は、メイン スレッドでのみ処理できることに注意してください。別のスレッドでグラフィックス デバイスを作成できると思いますが、試したことはありません。

反応時間を測定している場合、「present」コマンドを GPU に送信してからコンテンツが実際に画面に表示されるまでの間に遅延があることに注意してください。

于 2012-07-27T10:06:13.017 に答える
-1

私は XNA 開発の専門家ではありませんが、Windows Phone で既に同様の「問題」を抱えていることは知っています。(ゆっくりと問題)。

治療が多い場合は、マルチスレッドプログラミングを使用してください。

msdn : "プロセッサを集中的に使用するタスクが別のスレッドで実行されても、ユーザー インターフェイスがアクティブなままになるため、マルチスレッドを使用するアプリケーションは、ユーザー入力に対する応答性が向上します。マルチスレッドは、ワークロードの増加に応じてスレッドを追加できるため、スケーラブルなアプリケーションを作成する場合にも役立ちます。"

お役に立てば幸いです...

于 2012-07-27T08:57:42.933 に答える