■掲示板に戻る■ 全部 1- 最新50

ご意見ご感想スレ

18 :NyaRuRu : 2006/03/02(木) 13:15:33 ID:7/Yahnx6
サークル「不思議キッチン」のプログラマ等をやっていますNyaRuRuと申します.
C68,C69ではお世話になりました.
リプレイの再現性問題ですが,当サークルでも何度か問題になっていくつか調べたことがありますので,参考になりましたらと思い投稿させて頂きました.

1)DirectX9はデバイス初期化時にD3DCREATE_FPU_PRESERVEフラグを設定しなかった場合,FPUの丸めレジスタをsingle-precision,round-to-nearestに変更します.
もし何らかの原因でその後に割り込んだ処理がこの丸めレジスタをさらに書き換えた場合,丸め誤差の影響でリプレイが再現できなくなることがあります.
VisualC++でしたら_controlfp関数などで丸めレジスタの内容をチェックできますので,リプレイが再現できない環境でassertを仕込んで毎フレームチェックしてみるというのも手かもしれません.

2)DirectXSDKに付属するD3DXライブラリですが,実行時にCPU判定を行って内部的にMMX/SSE/SSE2/3DNow!の各最適化ルーチンに分岐します.
このためD3DXの算術関数がゲームエンジンで使用されている場合,同じ入力を与えても環境によって微妙に異なる結果となる可能性があります.
この場合後からD3DXを自前関数に置き換えるのは大変ですが,レジストリエントリを使用してこれらのCPU拡張命令を使用しないように出来ます.
このあたりについてまとめた記事を書いたことがありますので,参考になりましたら幸いです.

http://codezine.jp/a/article.aspx?aid=235

上の記事でも書きましたが,以下のレジストリキーにDWORDで1を設定すると,DirectXRuntimeはx87FPUで計算を行うようになります.
・HKLM\Software\Microsoft\Direct3D\DisablePSGP
・HKLM\Software\Microsoft\Direct3D\DisableD3DXPSGP
(・HKLM\Software\Microsoft\Direct3D\DisableMMXも以前は使用されていました)

順番が前後いたしますが,「とびでばいん」「とびまな」「とびつきひめ」楽しくプレイさせていただきました.どうもありがとうございます.


10 KB
続きを読む

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.php ver2.4 2005/04/13