エージング

エージングをなめてました。エージングてのは、言ってみれば耐久テストのことです。ライブラリを作ったとき、ライブラリを使ったサンプルみたいなのを作ってそれを延々と動かして、落ちないか、リークが無いか、assertにひっかからないか、などなどを確認したりするのです。
要は自分のプログラムにバグがないなどと思ってはいけないわけで。単体テストのコードが書きにくいとき、また単体テストで問題が発生するパターンが思いつかない時でも、複雑な状況を表現するプログラムを書いて、ひたすら様々なパターンで走らせ続けることで、思わぬバグを発見できることもあります。そして重要なのは、複雑な状況で落ちたときに、いかにその状況を再現するか。例えば397フレームで17番目のキャラクタで発生するassertを簡単に再現するにはどうすればいいのか?等。この辺はまだまだ修練が足りない領域です。
で、今日発見したバグに関連して気づいたこと。メッシュに対するコリジョンで、法線方向に押し出したい、と思ってもGJK(貫通深度を求める手法は厳密にはEPAですけど)では一筋縄ではいかないのね…そもそも法線方向に押し出すという目標があるってことは、最短の押し出し経路を求めるGJKの出る幕ではないじゃないか!!
なんか、今ブログを書いてて光が見えた、気がしました。GJKにこだわってばかりじゃ、駄目なのかもね。なんにしても任意のメッシュコリジョンは苦手です…