- 557 名前:499 ◆gJulfOQblk mailto:sage [2007/09/09(日) 06:55:36 ID:0UB6SgLv]
- ・ XNA - パフォーマンス (X3)
・ XNA の動作する構造 ・ Xbox シリーズのプログラムはカーネルモードで動く (360 にはその上にハイパバイザがあり、署名されていないコードは動かないようになっている。) ・ ただし、それを XNA にも適用すると動けないので、本来使われていない ユーザモード (JITおよびユーティリティコード) を使うことで非署名コードが動くように。 ・ つまり、カーネルモードへの呼び出し (本来必要がない) が入るため、原理的には少し遅くなる。 (1システムコール == 約4us) ・ というわけで、必要な最適化のひとつは、システムコールの回数の削減。 ・ Graphics コールは可能な限りバッチ化される ・ バッチできない API については若干数が多いので省略 (オリジナルの Gamefest の動画を参照w) ・ Effect.Clone をしてパラメータを変更しないようにすると速い (SetValue や Apply は BasicEffect の場合 20ms ほど時間がかかる) ・ SaveStateMode.SaveState を使わない (StateBlock の呼び出しに 34.5ms もかかるという…) ・ 数学演算は可能な限り参照にし、(Vector3 の madd で 1.6倍程度の差)もっと可能な場合はインラインにする (通常演算子の3.8倍) ・ 現在 SIMD をサポートしていない上、Vector3 の演算メソッド/演算子は、.NET の仕様でインライン化される条件を満たしていない (>>499注釈) ・ まぁ下手に SIMD にするのはマズい。(SSE と違ってパイプラインがものすごく深いため、機械的に置換すると遅すぎる) ・ Thread は、複数のコアへの分配をサポートしない (明示的に指定されない場合、コア0のスレッド1で開始される) ・ ThreadPool は、最適化されていない (ため、遅い?) ・ フレームワークとスレッドセーフ ・ オーディオとネットワーク(2.0以降) はスレッドセーフ ・ GraphicsDevice は、少しだけスレッドセーフ ・ リソースの作成と SetData (もちろん今現在使われていないモノだけね。) は非同期で行える ・ ContentManager はスレッドセーフではない ・ 入力は「スレッド化できない」 (メインスレッド上で読み取ること) ・ Windows でチューニングしろって言ってたけど…>>499個人的にはどれだけ効果があるか微妙 # 2048文字に収めるのが大変w
|

|