C++でゲームを開発することに関する愚痴

※ただの愚痴なので何も得られません

 日記を書けない日が続いています。毎日ゲーム制作には取り組んでおり、プログラムを毎日書いたり書き方を調べたりしています。具体的には、初期に書いたソースコードを全て捨てて、長期的な開発に耐えうるゲームエンジンだとか基礎みたいな部分を手がけています。

 C++はとても難しい言語です。僕が過去に触ったモダンなスクリプト言語たちより手強い事はもちろん予想していました。ただ僕は、Cを多少書いた経験があったので、なんとかなるだろうとタカをくくっていたのも確かです。それにしても、C++は予想を軽々と越えて扱い辛い言語でした。ネット上で「ゲームの開発言語といえば?」という質問に真っ先に名があがるC++言語。ですが、実のところC++を用いてフルスクラッチでゲームを作ろうとするアマチュアを殆ど見つける事が出来ません。その因果を今僕はひしひしと感じています。

 そんなわけでこの苦難を文字に起こすことにより自分のもやもやにケリを付け、引き続き取り組みを邁進したいと考え、ここに書きなぐっておくことにしました。

 書いてる僕自身も知識不足だからこういう状況になっているのは理解しているのですが、ゲームを作ってみようと軽い気持ちでこの巨象に触れてしまった無知なプログラマの素直な心情をここに吐露しておこうと思います。

Syntaxがひどい

 これは誰しもが認めるところである。もうひどいなんてもんじゃない。*とか&ならまだしもだったり&&だったり::*とか->*とか(*)とかもうわけわからない。可読性が高いコードなんて書けっこない。これに加えてオリジナルのクラス名がいたるところで型としてソースコードに埋め込まれていくので、もう左手でコード書きながら右手でハンギングロープを撚っている気持ちになる。

無防備すぎる

 これはC++が何でも出来る、速度が速いというコンセプトを持っている事に起因しているのだろうけども、温室育ちの僕にはC++の世界は世紀末そのもの。メモリに直接触れるとかそういう話ではない。例えば、=やら()のオペランドに変数を突っ込むと参照じゃなくコピーで渡されるなど、他の言語からしたらどうかしているヤバいルールが採用されている点を差している。もちろん回避方法があって、それを自分でコードに起こしていくわけだけど、ガードを固めれば固めるほど出来る事は減っていくし、型が合わなかったりしてそれを上手く動かすのに多大な労力がかかってくる。スマポとか&とかrvalueがどうだとかmoveとかconstとかコピーオペランドの禁止とかもうイロイロ手段も有りすぎるし、ネットでは「こうしないやつはC++使いとは認めたくないね」みたいな事を色んな書き方でみんな言ってるし、影響されやすい僕としては彼らに怒られないよう出来るだけカッコイイコードにしたいんだけれども、StrictなC++コードを書く、そしてSyntaxぴったりに一発で書く、そして設計としてもイケてるものを生み出す、という三拍子を実現するには僕のようなC++初心者にはむちゃくちゃツラい。

 他のLLな言語はこういうところに触る手段自体を用意していない事の方が多い。最速であり続けるというのは苦痛を伴うというのがよく分かる。

1つの機能に複数の方法がある

 マクロとかtypedefとかusingとかもう1つでいいじゃん。みたいな似たような機能が大量にある。最速を維持し続け、可能性を排除しない信条が生み出す痛みは、僕みたいな後から来たプログラマが一身に背負うのがC++界隈のエコシステムにきっとなっているんだろう。10年以上CやC++を追っかけていればこういった手段を上手く使い分ける事が出来るんだろうけど、僕のような新参者には拷問でしかない。新しいイケてる機能が追加されると「新機能○○は夢がひろがりんぐ! ××機能を使い続けるやつは糞プログラマ認定」みたいに書いてあったりして、でも機能が新しいからネット上で見つかるサンプルコードも少なくて。そんな毎日です。

型を合わせるのがダルすぎる

 これも速さゆえのルールなんだろうけど、とにかくダルい。ヘッダと実装を分けると、メンバ関数や変数の呼び出し元の戻り値部分と合わせて3つがピッタリ型があってないとコンパイルエラー。auto付けても2つ。型をあわせるために四苦八苦してると、ガンダムのドッキングシーンBGMが僕の頭でリフレインし続けるわけです。constやらスマポやら*&やら。こういった方々が輪をかけて事をややこしくする。初期化はともかく、戻り値とか…上手くしといてよホント。コンパイラも何か薄々感付いたようなメッセージ吐くし。分かってんならホント上手くしといて!

 最近、コード書いている時間の半分くらい型合わせに使ってる気がします。

メタプログラミング…弱くない?

 テンプレートとconstexprもあるしラムダ式もあるし関数ポインタもクラス変数(静的メンバ)もあるんだけど…。使いたかったけど調べても見つからなかった機能としては、メンバ関数や変数の一覧を取得する手段。おなじくメンバ関数の名前。コンパイルする、実体は自分で作らないとまったく存在しない仕組という手前、そういうのが無いのは理解できるんだけど、書き方に制限が出て、もやっとします。他の言語ではインタプリタが関数名や変数名を保管したりしてるのかな。

ビルドが大変

 クラスをディレクトリで階層化しててmakefileからコンパイルを通したら通らない。案の定サブディレクトリが上手く解決されてない。手がパタパタとよく動いてたタイミングで、急ブレーキ。ここでMakeの独自言語を深掘りしないといけないのがとても苦痛だった。cmakeというモダン? なビルドツールもあるらしいがどちらも独自言語で心が折れそうになる。Unityとか使った事ないけど[ ビ ル ド]みたいなボタン押せばきっと完成なんだろうなあいいなあ。

ネット上の情報が少ない

 Webで使われる言語と比較してC++の情報は圧倒的に少ない。日本語でも英語でも。あとコンパイラが複数あるのでエラーメッセージもコンパイラ毎に異なる。これはエラーメッセージを検索キーワードにネットを探すのがかなり難しくなる。OSXなのでclangなんだけどあんまり情報がヒットしない。VC++のコンパイルエラーだともっと引っかかる気がする。


 さーて、引き続きがんばって書くぞ!