CPUについて
昔からCpuは与えられた命令を淡々とこなすチップでした。
30年くらい前は少ないメモリに命令コードとデーターを置いて、結果を画面に出して遊ぶ単純なものでした。
今は複数のCPUを扱うことを想定してコードを書かないと速度が出ません。
別に手動でCPUに処理をしてもらう訳ではないので、そんなに大変ではないのです。
スレッドというプログラムを実行してもらう仕組みを使って組んでいきます。
スレッドは任された仕事(処理)を空いているCPUに処理してもらいます。
処理の途中で重たい処理になってくると、一旦処理を止めてCPUを明け渡します。また開いてるCPUを見つけては処理を再開します。
スレッドは優先順位を付けることができるので、優先度の高い処理はCPUを手放さずそのまま実行を続けることもできます。
問題は複数のスレッドを立ち上げたときに同じオブジェクトを見に行ったときに起こります。
例えばファイルが一つしかないのに10人の人が見に行ったら取り合いになりますよね。
それを防ぐためにクリティカルセクションという、今読んでるから待っててというブロックができます。この場合だと9人の人が順番に待つことになります。
コレが処理が遅くなる原因になります。見たり書いたりしたら即座に手放さないとどんどん行列ができてしまいます。
複数の人で読むことができる手段もありますが、書き込みは危険ですね。
とにかくCPUが暇な時間を作らないようにスケジュールを組みます。
GPUについて
昔はこういうものは無かったです。
ゲーム機や、CGが出てきて処理を何とか早くしようと作られたものです。
主に画面に高速に絵を書くために使います。
今はコンピュートシェーダーとして、CPUでまかないきれない単純作業を裏で実行するためにも使います。
シェーダーに絵やパラメーターを渡して画面に絵を書きます。
CPUでやったら時間がかかる処理を専用のチップで高速に計算してくれます。
結果的にこういうデバイスを使いこなして100%に近づけるようにチューニングしていきます。
ゲームにおけるハード理解度
必ずしもハードに詳しくなくてもゲームは作れますが、ある程度以上のものを作ることになると、途端にハードウェアの限界まで引き出さないと処理が追いつきません。
ハードにはいつも得手、不得手がありデバック期間でCPUの稼働率を見ながらチューニングをして行きます。
処理負荷が大きな所は処理を分割してスレッド化します。計算が終わったら結果をまとめて更に処理をします。
ゲーム制作はバグとの戦いです。
一度でもバグを出してしまうと、ユーザーは途端に飽きてしまいゲームをやらなくなってしまいます。
バグを起こさない組み方を徹底してくれれば楽なのですが、プログラマーは各々ポリシーがあり、独特な癖を発揮してバグを隠蔽します。
スレッドがあるおかげで速度を出しやすくなった反面、バグも見つけづらいです。
コメント