2013年4月6日土曜日

ゲームロジックがマルチコア対応し難い理由

マルチコア対応が必要な理由

 現在デジタルゲームの主流になっているハードウェアプラットフォームではマルチコアCPUが搭載される事が標準となっています。先日発表されたPS4では8コアがひとつのCPUに搭載されており、プログラムがマルチコアに対応する事により、8倍の性能を出す事ができます。しかし逆に言うとマルチコア対応していないプログラムは1/8の性能しか出せていないとも言えます。

マルチコア対応のプログラムを作成する場合はOSのサポートが必要です。OSはスレッドという単位でプログラムをCPUの各コアに割り振ります。プログラム側もスレッドによって分割される事を意識して作成する必要があります。OpenMPやIntelTBBのようなスレッドを扱う事をプログラマに意識させない仕組も登場していますが、プログラムをスレッド毎に分割して実行するという流れは変わりません。

ゲームロジックがマルチコア対応し難い理由

マルチコア対応のプログラムを作成する上で重要なのは、プログラムで処理するデータの独立性です。マルチコアで実行される各プログラムは本当に並列で実行されます。もし並列に実行されているプログラムが同じ領域に対して同時に読み書きをした場合は、結果を保障する事はできません。この問題を解決するために、プログラム中に並列に実行しない部分を作成する事ができますが、その分マルチコアで並列に実行する事によるメリットは薄れてしまいます。

マルチコア対応がしやすい分野としてシミュレーションが挙げられます。シミュレーションは大量のデータに対して同じプログラムを実行します。各データの独立性が高く、処理も単純な事が多いため、多くのシミュレーションプログラムはマルチコア対応をしています。

逆に難しいとされている分野がゲームロジックのプログラムになります。ゲームロジックを構成するモジュールは相互に依存関係があり頻繁にデータを参照し合います。この状態では並列にプログラムを実行することは出来ません。

ゲームロジックの中でも、キャラクターや飛び道具などのゲームオブジェクトは、並列に実行しやすい分類に入ります。ゲームオブジェクトは独立したデータを持ち、並列に実行出来ます。ただし、これも、ゲームオブジェクト同士の参照が発生すると並列実行する事は難しくなります。お互いに相手が更新中のデータを参照する事により、動作結果が保証されなくなります。

ゲームオブジェクトを同士をマルチコアで実行する方法

相互に参照関係のある複数のゲームオブジェクトを並列に実行するには、参照されるデータと更新するデータを分離する必要があります。これには、参照されるデータを二重に持って他のオブジェクトに参照される部分は、自身は更新しない。他のオブジェクトから情報を集める処理と、集めた情報を元に自身のデータを更新する処理を分割して、情報を集める処理と自身を更新する処理は別々に並列実行する。などの対応が必要になります。

ゲームオブジェクトが処理した結果を、別のゲームロジックのモジュールに渡す必要も出てきます。この場合、渡す先のモジュールがゲーム全体で扱う、ひとつの領域を持っている場合は、並列に動作させることは出来ません。並列に実行するためには、そのためのアルゴリズムとデータ構造が必要になります。

0 件のコメント:

コメントを投稿