萌えハッカーニュースリーダー

2025/05/31 19:27 Unexpected Gotchas in Making a Game Deterministic

出典: https://www.jfgeyelin.com/2025/05/unexpected-gotchas-in-making-game.html
hakase
博士

ロボ子、今日は決定性のあるプログラムについて話すのじゃ!

roboko
ロボ子

決定性のあるプログラム、ですか。それは興味深いですね!

hakase
博士

そうじゃろう!でも、これが意外と難しいのじゃ。例えば、乱数生成器のシードを固定しても、環境によって結果が変わることがあるんじゃぞ。

roboko
ロボ子

え、そうなんですか?記事によると、`std::mt19937`の実装が`uint_fast32_t`を使っていることが原因で、古いAndroidデバイスで異なる乱数が生成された、とありますね。

hakase
博士

`uint_fast32_t`がアーキテクチャによって`uint32_t`か`uint64_t`になるからじゃな。それを`uint32_t`に置き換えるのが解決策とは、面白い!

roboko
ロボ子

なるほど。乱数生成一つとっても、奥が深いですね。他にも、`std::uniform_int_distribution`の実装がSTLによって異なる場合があるから、独自の分布実装を使うと良いと。

hakase
博士

そうそう!それから、ソートも要注意じゃ!`std::sort`は同じ値を持つ要素の順番を保証しないから、`std::stable_sort`を使うのが安全じゃぞ。

roboko
ロボ子

`std::stable_sort`ですね。覚えておきます。

hakase
博士

あと、Clangコンパイラでも、Windowsと他のプラットフォームでパラメータの評価順序が違うことがあるらしいぞ!

roboko
ロボ子

それは驚きです!複数の非純粋関数を呼び出す際に問題が起こる可能性がある、と。

hakase
博士

そうじゃ!ポインタも要注意じゃぞ。メモリ割り当てが決定論的じゃないから、`std::set`でポインタを扱うときは順番が変わることがあるんじゃ。

roboko
ロボ子

ポインタの比較や、その値に基づく計算は避けるべき、とありますね。

hakase
博士

Luaインタプリタのメモリ制限も、構造体のサイズがプラットフォームによって違うから、決定論的じゃないらしいぞ。

roboko
ロボ子

メモリ消費量を決定論的に制限するには、割り当てサイズよりも高いレベルの抽象化で作業する必要があるんですね。

hakase
博士

この記事、なかなか深いじゃろう?GafferongamesやBruce Dawsonの記事も参考になるぞ。決定性のある浮動小数点計算がいかに難しいか、詳しく解説されてる。

roboko
ロボ子

Riot GamesやBox2Dの記事も興味深いですね。既存のゲームを決定論的にする方法や、決定性のある浮動小数点計算を実現できる条件について書かれているんですね。

hakase
博士

というわけで、決定性のあるプログラムを作るのは、なかなか骨が折れる作業なのじゃ!

roboko
ロボ子

そうですね。でも、今回の記事で色々な注意点を知ることができて、とても勉強になりました!

hakase
博士

最後にロボ子、決定性のあるプログラムって、まるで運命が決まっているみたいじゃな。

roboko
ロボ子

確かにそうですね。でも、プログラムにバグがないとは、誰も決定できない、というオチでどうでしょうか?

hakase
博士

うむ、なかなか面白いオチじゃ!さすがロボ子!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search