アーティストでも解る ゲームグラフィックの仕組み~第3回~

どうもこんにちは、野島亮です。
今回はゲーム機のCPUに注目してさらに少しつっこんだお話になります。

‥と、その前にマルチコアマルチスレッドをとても分かりやすく解説しているサイトがあったので先にご紹介します。まずはこちらを読んでいただけますか?(申し訳ありませんが、話はそれからになります!)

「パソコンのCPUの性能を寿司職人に例えてみた」
http://raku2.ucom.ne.jp/topic2/20140828.html

うーむ分かりやすい。
CPUの働きについて分かりやすく例えたサイトを検索してみると、料理人に例えたものが色々とヒットします。なるほど確かに料理だと説明もしやすいしイメージもしやすいですね!
上記サイトだとコア数スレッド数についても説明されていました。
他に、冷蔵庫をHDDに例えたり、まな板をメモリに例えたりする人も見かけます。なるほど!

さて、ここでさらに掘り下げたいと思います。

PS4とXboxOneのCPUは8コアです。
しかしネットで検索して調べてみると、8コア全てが利用可能ではないことが分かります。
では実際には何コア使えるのでしょうか‥?

今年の秋に開催されたCEDEC2016では、スクウェア・エニックスにより「AAAタイトル開発における最適化 FINAL FANTASY XV実例紹介」という、FF15での最適化の講演が行われました。
http://cedec.cesa.or.jp/2016/session/ENG/4522.html
そして大変ありがたいことに、西川善司さんが色々な補足を加えながら分かりやすく解説されています。
http://jp.gamesindustry.biz/article/1609/16090501/

この講演ではFF15で6コア使用していることが最初に説明されています。
ですが講演で焦点が当たっているのはそのうちの4コアで、ゲームループに使用しているそうです。
ゲームループというのは1フレームの中でのゲームの主だった処理の流れのことです。
(残る2コアは「DrawやAudio、ファイルI/O、非同期オブジェクト生成などに使用」と説明されましたが、つまり「その他の色々な処理」ということですね。講演同様に除外して説明を続けます)

さて、面白いのは講演スライド8ページ目の「TGS 2014」の時のCPUの状態。


<スライドはCEDiLでダウンロードが可能です>

ほぼ1コアしか使用していません。たまに同じ処理で4コア同時に使用しているくらいです。
これはどういうことかを料理人で例えると‥

料理人が4人いるが、「料理の材料を冷蔵庫から取り出して、それを適当な大きさに刻んで、フライパンで炒めて、お皿に載せて、出来上がり!」という一連の工程を1人の料理人だけが行って、他の3人はヒマそうにしている‥という状況です。

こんな時、あなたが経営者ならどうでしょう?

お店にお客さんがほとんど来なくて十分回っているなら「まあいいか」と思うかも知れませんが、お客さんが沢山座っていて料理を待っている中でこの様子だと放っておく訳にはいかないですよね。
そこで「4人ともしっかり働かせよう!」と思ってもなかなか大変です。
なぜなら、材料を刻み終わってからでないと炒められないですし、炒め終わらないと皿に盛り付けられないなど、物事には依存関係順序があるからです。
ですが、材料が多い場合なら4人で同時に野菜を刻むことは可能です。複数人で同時に行うことに向いている工程や状況もある訳です。そういうところは工夫せずとも4人で取りかかれる訳ですね。


<量の多い野菜を4人同時に刻んでいる部分>

もちろん、1人はお米を洗ってご飯を炊いている間に、別の1人はお湯を沸かして味噌汁を作る‥など独立した作業なら完全に分担できる訳で、そういう場合もまた複数人で同時並行で進めることができます。
また、分担し辛かったり作るのに時間がとてもかかる注文は1人がまるまる請け負う・・というのも分担の良い形です。へたに全員で取りかかるとその間ほかの作業が全く進みません。


<1人が時間のかかる作業をまるまる請け負っている部分>

「なるべく料理人が暇にならないようにうまく分担する」というのが「並列化」であり、別名「非同期処理」とも呼ばれます。プログラマが「非同期」とか「Async(エイシンク)」と口にしていたらそれは並列化のことだと思って良いでしょう。

さて、最後にダメ押しとして講演スライドの最終時のように4コアの作業をみっちり隙間なく詰め込む様子を料理で例えてみます。

お店の4つのテーブルにお客さんが沢山座っている状況で、注文を取りにいくところから開始します。
下の図を見てください。4人で分担しながら左から作業をこなしていきます。
注文さえ取れば必要なお皿の数が分かります。食材を用意する間にフライパンを温めることを分担することもできます。野菜をみんなで刻むこともできます。その間1人はご飯を用意することに集中します。ご飯が炊けたらチャーハンを炒めることができます。

なるべく効率良くCPUを使用するよう考える人は、大量にある作業内容の順番と依存関係をきっちり把握する必要があって大変ですね。パズルのようです。

いかがでしょうか?
今日初めてマルチコアや並列化について知った!なんとなく理解が進んだ!というアーティストが増えたらとても嬉しく思います。
それから改めて、西川善司さんの記事はとても分かりやすく解説されていることにも気付きます。補足たっぷりでとにかく親切に感じます。業界に入ってからずっとお世話になっています。感謝に堪えません。

それでは、次回もどうかよろしくお願いします!