ゲーム開発とSTL

コンシューマ向けゲーム開発に携わって結構な年数が経過しました。
これまでは恵まれていたのか、STLを使える環境にいた*1ので特に気にしていなかったのですが、どうやら場所によってはSTLはゲーム開発向きではないらしく使用を禁止される事もあるようです。
おかしいですね。私、STL使ってコンシューマ向けのゲーム作ってきましたけど。


確かにSTLはその特性と使用方法を知らないと痛い目にあいます。特にコンシューマ機のメインメモリ容量はPCに比べて圧倒的に少ないです。その少ないメインメモリ上に実行バイナリやヒープ領域などを展開しなければなりません。メモリ管理に対してシビアになるのは当然で、templateは使用方法によってはバイナリサイズが増大するので使用をある程度制限する事は仕方ありません。
また、std::listや、std::map等は使えば使う程内部でメモリを平然と分断してくれるので、ヒープ領域の総量は足りているけれど、使用可能な容量がないという状況に陥る可能性があります。ですので、私がいた環境では皆ゲーム側のコードには、std::listやstd::mapなどのメモリ分断するようなコンテナの使用は避けていましたし、新人さんがうっかり使ってしまった場合は、なぜそれをゲーム側で使用するのを避けてるのかを説明して、構造を変えてもらう事で対応していました*2


そういえば、とあるゲーム会社の方が書かれたとあるゲーム開発に関する書籍の中でstd::vectorが酷評されておりました。erase()が危険ですか。push_back()もnew()が発生して非効率ですか。erase()ってstd::remove()やstd::remove_if()と組み合わせて使うものですよね? push_back()する前にreserve()しますよね? コンシューマ向けのゲームの場合メモリ管理用のコードがあるはずでそれを使ってglobal定義のnew()をoverloadしますよね?*3 そもそもこの本、std::vectorに対しては酷い評価なのにstd::mapは絶賛していて、STLはmapを使うためにあるとまで書いてあって、正直何言ってんだと。


STLを禁止する人で最も困るのが、STLが何かわかっていない人です。STLコンテナの事を指してSTLと言っている事が多々ありますが、STLはコンテナやイテレータ、アルゴリズム、ファンクタなどのライブラリ郡の総称であって、コンテナだけがSTLなわけではありません*4。std::lower_boundみたいな配列にもコンテナにも使用できる素晴しいアルゴリズム、ご存知ですか? これと同質の函数が書けますか?


STLがわかっていない人が多いため使用が禁止されたという話も聞いた事があります。プログラマですよね? わかっていないから使用禁止だなんてちゃんちゃらおかしいですね。仕事で使っている言語の標準ライブラリですよ? わからないなら調べましょうよ。


Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)


Effective STL―STLを効果的に使いこなす50の鉄則

Effective STL―STLを効果的に使いこなす50の鉄則

  • 作者: スコットメイヤーズ,Scott Meyers,細谷昭
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2002/01
  • メディア: 単行本
  • 購入: 9人 クリック: 155回
  • この商品を含むブログ (93件) を見る

Efficient C++パフォーマンスプログラミングテクニック

Efficient C++パフォーマンスプログラミングテクニック

  • 作者: ダブブルカ,デビットメイヒュ,浜田光之,Dov Bulka,David Mayhew,浜田真理
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/07
  • メディア: 単行本
  • 購入: 9人 クリック: 149回
  • この商品を含むブログ (31件) を見る


もし、頭ごなしに、"STL使用禁止!!"というルールがある現場に出会した時は、自分の不運を呪いながら、地道な布教活動をしていくか、大人しく別の現場を探しましょう。

*1:というか皆STLがどういう物か最低限理解していた

*2:止むを得ない場合はそのままにしましたが

*3:これが根本的に解決するわけではありませんが

*4:std::stringもSTLと言う人がいますがstd::stringは標準C++ライブラリではありますがSTL属ではないはずです