ゲーム開発者は押さえたい。「C++」の奥深い世界 ~エンジニアが語る技術愛 #12~

ゲーム開発者は押さえたい。「C++」の奥深い世界 ~エンジニアが語る技術愛 #12~

MIXIには、探究心あふれるエンジニアがたくさん在籍しています。
その探究心は業務で扱う技術に留まらず、趣味で書いているプログラムだったり、個人的に研究している言語だったりと、自身の気になった技術への追求も留まることを知りません。今回は、モンスターストライクアプリ開発に携わるアプリエンジニアの佐々木に「C++」の魅力を語ってもらいました!

佐々木 智崇
2020年 新卒入社。モンスト事業本部所属。趣味はゲームと友達と飲みに行くこと。

C++との出会い

━━C++を使い始めたのはいつ頃からですか?
私が一番最初にC++に出会ったのは学生の授業のときでした。元々C言語を学んでいたのですが、そこからクラスを使い始める流れの中で、C++にはじめて触れました。

━━はじめて触れた印象はどうでしたか?
C++は最初、C with Classesという名前で世に出てきました。そこから紆余曲折があって、C++という名前になっています。つまり、大まかに言えばC言語にクラス機能を追加した言語になります。そのため、ほぼC言語だなという印象でした。
その程度の印象しかなかったので、「わからなかったら最悪Cで書けばいいかな」くらいに思っていました。実際C++はC言語と互換性を持っているので問題なくコンパイル、ビルドできます。
そういった意味ではC言語が使えれば、C++は全然問題なく使えると思います。ただ、C++の極意というか、奥深いところを知ろうとするとC言語の知識だけでは足りなくなるという印象です。

━━学生時代にはどういった開発をしていたのですか?
友達とGame Jamによく参加していて、そこで一緒にゲームを作っていました。そのときもC++を使っていましたね。一緒に参加していた友人がC++で作ったゲーム制作用フレームワークがあったのですが、ハッカソンの中でそれを修正しながらゲーム開発を行ったりしていました。

後は授業の中でもゲームを作るので、そのためのライブラリをC++で作っていました。

C++の推し機能はコンパイル時計算とテンプレート

━━C++の推し機能について教えてください
個人的にC++の推し機能は2つあります。1つはコンパイル時計算で、もう1つはテンプレートです。

━━では、まずはコンパイル時計算からお願いします
コンパイル時計算というのは、あらかじめ結果がわかっている計算処理について、コンパイル時に行ってくれるものです。例えばコード上で3+4の結果を変数に代入しているとしたら、それは結果が7と決まっています。そういった部分をコンパイル時に計算してくれる機能です。
コンパイル時計算によって実行時には計算処理をせず、コンパイル時にすべて計算を終えられます。この機能をふんだんに使ったsproutというライブラリはC++がデフォルトで提供しているクラスをコンパイル時計算に対応させたライブラリで、Visual StudioのC++コンパイラのテスト用コードにも採用されています。

━━どういった場面で使える機能でしょうか?
コンパイル時計算は実行速度に大きく影響します。例えばWindowsの実行ファイルを実行したときに、すでに計算処理が終わっている状態になるので、実行時間は短くなります。
sproutの作者の方はレイトレーシングの計算をコンパイル時に終わらせる、みたいなこともしてたというのを風の噂で…。

━━実行時間は大事ですね!ちなみに競技プログラミングの世界でもC++が一番使われているようです
そうですね。競技プログラミングでは、実行速度が求められるので実行時間が速い言語の方が有利になります。そうした理由があって、C++が選ばれているのでしょう。
モンスターストライクチームとしてもゲームの速度は重視しているので、そうした点でもC++は貢献できています。

━━テンプレートはどういった機能ですか?
テンプレートは、他言語だとジェネリックと呼ばれたりします。型やコンパイル時に定まる値をパラメータ化する機能です。

C++では、テンプレートを用いたテンプレートメタプログラミングができます。これはコンパイラ時に作用するテンプレートがチューリング完全なことを利用したメタプログラミング手法です。
テンプレートとSFINAE(Substitution Failure Is Not An Error。スフィネェ)を組み合わせて色々なライブラリなどで使われています。

━━極めると色々できそうですが、課題はありますか?
テンプレートが使えるようになると、何でもテンプレートに置き換えたくなってしまいます。ただ、あまりやり過ぎると他の人に引き継ぐ際やビルド速度に問題が出ると感じますので、バランスが大事だと思います。

━━他にC++で開発している面白さはありますか?
自分はグラフィックスAPI勉強するの好きなんですが、DirectXやVulkanの有名なものは提供されているライブラリがC++なので非常に入りやすいですね。こういった低レイヤー部分のAPIを学ぶときにC++使えると簡単にコード書き始められるのは学ぶ上で面白いなって思います。

━━逆に、開発時に注意していることはありますか?C言語やC++ではメモリ管理に苦労するイメージがあります
個人で開発を行う際には、なるべくスマートポインタを利用するようにしています。スマートポインタを使えば、メモリ管理をある程度クラスに任せられるようになります。そうすればメモリ管理を自分で行わなくても良くなります。
それでも完全に漏れを防ぐことはできないのですが…使い方を間違えなければ、基本的には大丈夫かなと思います。

━━C++で辛いなと感じる場面はありますか?
C++でWindowsやmacOS、Linuxなど複数のプラットフォーム向けにバイナリを作るのはちょっと面倒なのが難点ですね。マルチプラットフォーム対応についてはC++はまだ遅れているかなと思います。
これはモンスターストライクのAndroid、iOS対応の部分でも感じることがあります。

ゲーム開発者はC++を学ぼう!

━━業務でもC++がメイン言語でしょうか?
はい。私のチームはモンスターストライクのAndroid/iOS共通部分を開発していて、そのコードはC++で書かれています。一部のネイティブ部分は、iOS、Androidそれぞれ異なる言語を利用しています。そのため、自分のC++スキルが仕事に直結しています。

━━参考にしている情報源はありますか?
cpprefjpとcppreferenceをよく見ます。この2つのサイトにはかなりお世話になっていて、困ったらとりあえずここに…といった感じでよく訪れます(笑)。更新してくださっている方々には頭が上がりません…。

━━最後に、今後挑戦してみたいことを教えてください。
やはりC++が好きなので、コンパイル時計算やテンプレートメタプログラミングを使って高速化と最適化を推し進めたいです。モンスターストライクについては歴史の長いアプリということもあって一筋縄にはいかないと思いますが、改善できる部分があれば取り組んでいきたいと考えています。

PAGE TOP