C++を知らないゲームプログラマ達

マルチプラットホームライブラリを作ってみた。
※リンク先pdf


有名なSEGA本の著者、平山さんによる今年のCEDECでの講演内容である。

ゲームプログラマになる前に覚えておきたい技術

ゲームプログラマになる前に覚えておきたい技術

内容的には十分読み応えのあるのだが、一部釈然としないところもある。
主に4.9章の「標準ライブラリや言語機能について」というところから。

何故標準が嫌なのか

ゲームプログラマはなぜかC++標準ライブラリを使わない。
いや、使おうとする人もいるが何かと理由をつけて使わない。
その理由が大体困ったような内容が多い。


リンク先でも書かれているが、vectorにはpush_back()やerase()がある。
そしてこれは安全性と性能の両面で危険な面がある。その通りである。
しかし「erase()は必要ない」と書かれている。
私は「は?」と首をかしげたくなってしまった。
確かにvectorのerase()は何も考えずに使用すると膨大なコピーコストが発生してしまう。
が、vectorにはErase-Removeイディオムというものを使用することにより効率的な要素の削除を行う事も出来る。
それでもなお、「erase()は使うな!削除はpop_back()だけにしろ!」というのならさすがに私はその人を疑ってしまう。


またnewに対して異常に保守的なのも気になる。
もちろん考えなしにnewを行うのは危険ではあるが、vector程度のnewでコストが気にかかるようなことはまずない。
そもそもvectorではreserve()をしておけば余分なメモリを確保することもないはず。
結局動的なコンテナやそれに近いものを実装する際にはメモリを確保することになるので、わざわざ自分で作る理由はない。

そもそもそれは問題ではない

私はSTLを使うことによって大きな問題に出喰わすような事は過去に一度もありませんでした。
ボトルネックになるようなところはコリジョンなどもっと根本的な部分が殆どで、メモリはプールから使用する場合も多く、そういった場合は大量にnewしようがmalloc()しようがさほどのコストにもならない。
そこに対して異常に保守的になってしまい、使用禁止にしてしまうには勿体なさすぎる。
STLはただのコンテナではなく、"コンテナ"、"アルゴリズム"、"イテレータ"、"関数オブジェクト"を統合的に扱う事の出来る素晴しい標準ライブラリです。
それぞれを理解して使用すれば圧倒的に楽をする事が出来るし、間違いなく自信にも繋がる。
なのに、ゲームプログラマC++を理解しようとしない人が多い。

なぜ理解しようとしないのか

必要性を感じないから。そんなものはなくてもゲームは作れるし、アプリケーションも作れます。間違いではない。
そこを理解しようとするために時間を使うならと勉強をしようとしない。
確かに平山さんの言っている事はもっともでもあるし、自分自身でも正しいというつもりもないと言っている。
だが、そこで使う側に理解してもらおうという努力を怠ってしまっているのは悲しい事実である。
C++は膨大な仕様で面倒な事が多すぎるというのも確かだが、なぜそこで理解しようと思わずに思考停止してしまうのか。


現実的に言えば上の人にそんな事は言えないし、押し付ける事は出来ない。
問題が出るくらいなら出る前から対策しておくべきという事だろう。
悲しい事だが、これが紛れもない現実である。

C++を勘違いしてる人の多さ

殆どのゲームプログラマは本当のC++を知りません。
既にC++を過去のプログラミング言語と思っている人も沢山います。
しかしそれは勘違いであり、今なお先進的な言語でもあり、最も古臭い言語でもあるのです。
本当のC++プログラマの負担を最低限に抑えるし、現実的な問題の解決法も持っています。
それを知らない人達はC++をdisり、理解しようともせずにコードを書いてしまい、「C++なんてクソ!」と言い放ちます。
そんな日々をみるたびに私は悲しく思います。