07/09/09 06:55:36 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