前職でのゲーム開発について
開発の中で感じたこと
私は前職で家庭用ゲームソフトおよびアーケードゲームの開発に携わっていたが、開発言語はC/C++
を使用していた。
未初期化変数によるバグなんかはいろいろな場所で起きていて、開発中どこにでも発生する。
そして、開発の中期から末期にかけてメモリ破壊に悩まされることが残念ながらプロジェクトの常であった。
これらはSTL
やC++11以降の記述方法
を知ってさえいれば、バグの発生する割合自体は減らせる。
実際、Effective C++
やModern Effective C++
、その他コーディング本などいろいろ読み漁ったところ、プロジェクトで書いた自分のコードは有償の静的解析ツールでもほとんどひっかかることはなかった。
しかし、自分がいくらC++関連の学習をしたといってもプログラムはチーム全体で書き上げるものであり、属するプログラマー全員がそれなりにC++に精通していなければ結局は未初期化やバッファオーバーランによるバグに付き合わされる。
ゲームプログラマーはやはりゲームを作ることに主軸を置きたいのが一般的で、正直なところC++の規格を理解したいわけではない。
そういった意味で、C++自体がそもそもエンジニアリング(チームでのゲーム開発)に向いていない言語ではないかと感じるようになってしまっていた。
苦労した点
前述の通り、メモリ破壊の調査にしばしば付き合わされていた。
メモリ破壊に関するバグは、そもそも最初からメモリ破壊が原因とすぐに判明するものではない。
はっきりいってだいたいそもそも未定義動作なのである…。
なので、「貴方の担当箇所にバグが起こったため調査してくれ」と報告が来てから調査することになるのだが、私の書いたコードではなく、他人が書いたコードによってメモリが破壊されていた場合、心当たりがないところからその人が書いたコードまで探り当てないとならない。
これはもちろんかなりの時間を要する。また、ネットワークの同期が絡むとさらに大変なことになる。
解決方法
バグフィックスには基本的にメモリが破壊されている箇所を発見 -> メモリを破壊している箇所を発見というプロセスが必要になる。
メモリが破壊されている箇所を発見するまでの手順
まずはバグが再現するまで実際にアプリを動かしてみる、もしくはダンプファイルを確認することになる。
このとき、通信の周りで起きているとわかった場合にはその前後に多くログを仕込んでおく。
基本的にはそれによりクラッシュ箇所がわかるのでクラッシュするよりも前のステップにてメモリ検査を二分探索していく。
メモリを破壊している箇所を発見するまでの手順
メモリが破壊されている箇所を発見次第、ハードウェアブレークポイントを置いたり、デバッガを用いて近くでバッファオーバーランを行っている場所はないか確認していく。
最適化されている場合はデバッガなどはほぼ使えないのでアセンブリコードを読み、検討をつけていくことがしばしばあった。
通信を行う場合もタイムアウトの問題などがあり、デバッガやブレークポイントが使えないことがあるが、この場合はログを確認していくことになる。
確認にはやはり二分探索を基本的に用いることになるが、運が良ければメモリを破壊している箇所はメモリが破壊されている箇所の近くに配置されている。
また、メモリを破壊している箇所は静的解析ツールを用いて検討をつけることも可能なので積極的に使用していた。
反省点
仕事上で発生した問題を解決したことを長々と述べさせてもらったが、そんなことより失敗を予防するアプローチを取れたほうがいい。
今回は、メモリ破壊についての解決方法を記述したが、予防法としてはおそらく、
これらはSTLやC++11以降の記述方法を知ってさえいれば、バグの発生する割合自体は減らせる。
実際、Effective C++やModern Effective C++、その他コーディング本などいろいろ読み漁ったところ、プロジェクトで書いた自分のコードは有償の静的解析ツールでもほとんどひっかかることはなかった。
上のように私が行ったことをプロジェクト全体で実践し、静的解析ツールを継続的インテグレーションで動かすのがよいだろう。
さいごに
転職活動のために前職で行っていた開発について振り返ってみたが、Qiitaにも投稿しておけたらなと感じ、投稿することにした。
ゲームプログラマーの中でもC++の言語仕様に詳しくなる苦労をしてでもバグを少なくしたい人と、
そんなのどうでもよく、いいゲームができればそれでいいと感じる人(おそらく大半を占める)の意識の乖離は残念ながらこれからも埋まることはないだろう。
ゲームエンジンはこの問題を根本的な意味で解決するものではないだろうが、この乖離をある程度覆い隠せるものとして流行って当然だと考えられる。
似たような問題はおそらくゲーム業界以外でもあるだろうが、ゲーム業界においてはもしかしたらゲームエンジンがこれを解決するものになりうるかもしれません。
すごいハイエンドなゲームを作りたいんだ!というならばまた同じ道を辿らざるえないかもしれませんが…。