リプレイは何気に大変

http://d.hatena.ne.jp/ABA/20080120#p2

・オブジェクトのフィールド初期化やオブジェクトプールのインデックス初期化が不完全でオブジェクトの振る舞いが一定しない
・乱数インスタンスにシードを与えるのを忘れている
・Drawメソッドの中でカウンタなどを操作してしまいフレーム落ち時にずれる
・リプレイ用に初期化した後に一回余計にUpdateしてしまい初期フレームがずれる

あるあるwwwつうか、全部経験した気が…。あと、やらかしたなかでアチャーだったのが、

  • ポーズボタンまでリプレイ記録した

リプレイ再生したらポーズ勝手にかけよるwwwさらには、

  • ポーズ中もリプレイを記録し続けてた

意外とやばくて、ほっとくと固定長配列のバッファを食い尽くして落ちる。あと、真面目に考えると、ポーズして解除する際に、ABAさんの挙げられてた「一回余計にUpdateしてしまいずれる」が発生しそうなので、気をつけたほうがいいかも。

とりあえず現段階で一番怖いように思うのが、「Drawメソッドの中でカウンタなどを操作してしまいフレーム落ち時にずれる」。確か直近のやつでこのバグを出しちゃったと思うのだが*1、「Drawの中で更新なんて馬鹿な」と思いきや結構やらかしてしまう。Drawメソッドの中で、外部のデータを更新する必要は一切無いハズなので、起こりようが無い気もするが、なんたって思わず乱数を呼び出しただけでも駄目なのだ(Draw専用に乱数発生器のインスタンスがあれば別ですが)。「気をつけてれば防げるバグ」は絶対に防げないという持論なので、できれば気をつけてないソースをコンパイル段階とかで検出できるフレームワークにしたい…。Drawメソッドには外に対して一切の手出しが出来ないように固めるような言語仕様ってあるのかな…?

一応、UpdateメソッドとDrawメソッドの実行回数をズラすような、「リプレイ再生速度可変機能」を実装すれば、高速再生時に速攻ズレたりして、検出がしやすかったりだが、根本的な解決じゃないなぁ…。