以下、本発明の実施の形態に係るゲームプログラム、記録媒体、及びコンピュータ装置について、図面を参照しつつ説明する。
[ハードウェアの構成]
図1は、本発明の実施の形態に係るゲーム装置(コンピュータ装置)の構成を示すブロック図である。ゲーム装置1は、片手で持ち運びできる程度の寸法のボックス形状を成すハウジングに収納されており、図1に示すように、このゲーム装置1にはCPU(Central Processing Unit)3を有する制御部8が備えられている。制御部8においてCPU3は、データ転送を統括的に制御するメモリコントローラ2を介して、GPU(Graphics Processing Unit)4、メインメモリ5、及びDSP(Digital Signal Processor)6に接続されている。また、メモリコントローラ2には、バス9を介して、コントローラ・インタフェース(以下、「インタフェース」は「I/F」と記す)10、ビデオI/F11、外部メモリI/F12、オーディオI/F13、及びディスクI/F14が接続されている。そして、コントローラI/F10には受信ユニット15が接続され、オーディオI/F13及びディスクI/F14にはディスクドライブ16が接続されている。
更に、ゲーム装置1が有するビデオI/F11及びオーディオI/F13には、外部機器であるモニタ(ディスプレイ)20及びスピーカ22が夫々に接続可能になっており、記録媒体としてのメモリカード21及び光ディスク23が、外部メモリI/F12及びディスクドライブ16に対して夫々装填可能になっている。
このうちCPU3は、図示しないブートROMに記録された起動プログラムを実行してメインメモリ5の初期化等を行った後、ディスクドライブ16に装填された光ディスク23に記録されているゲームプログラム24を実行し、該ゲームプログラム24の内容に応じたゲーム処理を行うものである。後に詳述するが、このゲーム処理の一例として、CPU3は、経時的に変化する三次元の仮想ゲーム空間の各フレーム(画像)を示すフレームデータを算出し、該フレームデータを、メインメモリ5を介してGPU4へ受け渡すことを行う。また、メインメモリ5は、CPU3の動作時に使用されるデータを記録する記録領域を有し、例えば、光ディスク23から読み出されたゲームプログラム24や各種のデータを記録する。
GPU4は、三次元グラフィックスの表示に必要な計算処理を行う半導体チップで構成されており、CPU3からの指示に基づいて画像処理を行う。例えば、GPU4は、メインメモリ5の一部の記録領域や図示しない画像処理専用のメモリを用い、CPU3から受信したフレームデータをレンダリング処理して各フレーム(画像)を生成することができ、このフレームは、メモリコントローラ2及びビデオI/F11を介してモニタ20に出力(表示)される。
DSP6は、CPU3がゲームプログラム24を実行しているときに生成されるサウンドデータの処理を行うものであり、該サウンドデータを記録するためのARAM(Audio RAM)7が接続されている。DSP6は、光ディスク23から先読みしておいたサウンドデータをARAM7に記録しておき、適宜のタイミングでARAM7から読み出したサウンドデータを出力するものであり、DSP6から出力されたサウンドデータは、メモリコントローラ2及びオーディオI/F13を介してスピーカ22から外部へ出力される。
一方、受信ユニット15は、ゲーム装置1とは別体を成すコントローラ(Remote controller)30(図2参照)から送られてきたデータを受信するものであり、受信したデータは、コントローラI/F10及びメモリコントローラ2を介してCPU3へ送られる。外部メモリI/F12は、メモリカード21が装填された状態で該メモリカード21内の記録領域にアクセス可能であり、該記録領域内のデータを読み出し、又はバックアップデータを書き込むことができる。
オーディオI/F13に接続されたスピーカ22は、上述したようにDSP6がARAM7から読み出したサウンドデータを外部へ出力する他、ディスクドライブ16が光ディスク23から読み出したサウンドデータを直接的に外部へ出力する。また、ディスクドライブ16は、上述したように、装填された光ディスク23に記録されたゲームプログラム24を読み出し、このゲームプログラム24をオーディオI/F13又はディスクI/F14へ出力する。
図2は、ゲーム装置1とは別体を成すコントローラ30の構成を機能的に示すブロック図である。コントローラ30は、例えばプラスチック成型により形成された略直方体形状を成すハウジングを有しており、片手で把持可能な寸法に設計されている。そして、図2に示すように、コントローラ30は、撮像情報演算部31、通信部32、操作部33、加速度センサ34、及びバイブレータ35を備えている。
撮像情報演算部31は、赤外線フィルタ31a、レンズ31b、撮像素子31c、及び画像処理回路31dを有しており、赤外線フィルタ31aは、外部からの入射光のうち赤外線のみをレンズ31bへ通過させる。レンズ31bは、赤外線フィルタ31aを通過した赤外線を集光して撮像素子31cへ出射する。撮像素子31cは、例えばCMOSセンサのような固体撮像素子であって、レンズ31bが集光した赤外線を撮像して画像データを生成する。ここで、ゲーム装置1に接続されるモニタ20(図1参照)には、高輝度の赤外線を発光する2つの発光部(図示せず)が設けられており、画像処理回路31dは、撮像素子31cで生成された画像データから高輝度部分を抽出することにより、前記発光部からの光を検出する。そして、画像処理回路31dは、検出した光に基づいてコントローラ30の向きを示すデータを算出し、該データを通信部32へ出力する。
通信部32は、マイクロコンピュータ(Micro Computer:マイコン)32a、メモリ32b、無線モジュール32c、及びアンテナ32dを有している。この通信部32は、マイコン32aが無線モジュール32cの動作を制御することによって、所定のデータをアンテナ32dから外部に対して無線送信するものであり、送信処理の際にメモリ32bはデータの記録領域として使用される。また、アンテナ32dから無線送信されたデータは、ゲーム装置1が備える受信ユニット15(図1参照)において受信可能になっている。
操作部33は、十字キー及び各種のボタンスイッチを有しており、これらは、コントローラ30を把持したプレイヤの手によって操作可能になっている。そして、プレイヤにより操作部33が操作されると、何れのキー又はスイッチが操作されたかを示す操作信号が、通信部32によってゲーム装置1へ送信されるようになっている。また、加速度センサ34は、コントローラ7に対して設定された直交3軸方向(上下方向、左右方向、及び前後方向)についての加速度を検出するものであり、検出された加速度を示す信号は、通信部32によってゲーム装置1へ送信される。
バイブレータ35は、例えば偏芯質量を有する振動モータ又はソレノイド等を備えており、その作動によってコントローラ30自身に振動を発生させることができる。該バイブレータ35を適宜作動させることにより、コントローラ30を把持するプレイヤの手に振動を体感させることができ、いわゆる振動対応ゲームが実現できる。
なお、上述したコントローラ30の向きを示すデータ、操作信号、及び加速度を示す信号等は、通信部32から無線送信されるに先だって一時的にメモリ32bに格納される。マイコン32aは、無線モジュール32cを制御して、このメモリ32bに格納されているデータを所定周波数の搬送波にのせ、所定の短い周期で、アンテナ32dから送信するようになっている。
[ゲーム内容]
上述したような構成を備える本ゲーム装置1は、ゲームプログラム24を実行することにより、ステージ毎に設定された仮想ゲーム空間をモニタ20に表示し、また、この仮想ゲーム空間内にプレイヤキャラクタを表示させる。このプレイヤキャラクタはプレイヤの操作に応じて仮想ゲーム空間内を行動し、仮想ゲーム空間内には、プレイヤキャラクタの進行を阻むようにして次々と敵キャラクタが出現する。そして本ゲームでは、プレイヤが、プレイヤキャラクタを操作してこれらの敵キャラクタを次々と倒しながら、仮想ゲーム空間内でプレイヤキャラクタを進めて行く。
図3は、本ゲームの戦闘シーンの動画を構成するフレームの一例を示す模式図である。この図3に示すように、フレーム40は、プレイヤキャラクタC1及び敵キャラクタC2などを配置した三次元の仮想ゲーム空間41を、仮想カメラ(図示せず)からの視点で撮影した奥行き感のある画像となっている。そして、戦闘シーンでは、フレーム40に表示された仮想ゲーム空間41内に、一体のプレイヤキャラクタC1と複数の敵キャラクタC2とが配置されている。プレイヤキャラクタC1は、プレイヤがコントローラ30を操作することによって仮想ゲーム空間41内で行動させることができる動的オブジェクトであり、例えば、仮想ゲーム空間41内で所望の方向へ移動したり、敵キャラクタC2に対して刀を振り下ろしたり、といった各種の動作を実行させることができる。
また、敵キャラクタC2は、後に詳述する制御部8によって動作が制御される動的オブジェクトであり、各自に設定された思考パターンに基づいて仮想ゲーム空間41内を行動し、プレイヤキャラクタC1に対して攻撃を仕掛けてくるようになっている。本ゲームでは、1つのフレーム40に最大30体の敵キャラクタC2を同時に配置して行動させることができ、換言すれば、モニタ20に、最大30体の動作する敵キャラクタC2を表示させることができる。そして、プレイヤは、コントローラ30を介してプレイヤキャラクタC1を操作し、これらの敵キャラクタC2を次々と倒しながらステージを進行させる。なお、仮想ゲーム空間41には、プレイヤキャラクタC1や敵キャラクタC2のような動的オブジェクトの他にも、背景を構成するものとして建築物などの静的オブジェクトC3も配置されている。
ところで、プレイヤキャラクタC1と敵キャラクタC2との戦闘シーンなどの動画をモニタ20に表示するため、ゲーム装置1は、各キャラクタC1,C2の動作に応じて経時的に内容が刻々と変化するフレーム40を、所定のフレームレート(以下、「フレームレートの基準値」といい、本実施の形態では60fps)で生成している。しかしながら、上記のように最大30体もの敵キャラクタC2を同時に動作させるため、ゲーム装置1の処理能力を超える過大な負荷がかかる場合がある。この場合、実際のフレームレート(以下、「フレームレートの実測値」という)が、上記基準値より小さくなったり、一又は複数のフレーム40がモニタ20に表示できなかったり、といった処理落ち現象が発生する可能性がある。そこで、本ゲーム装置1は、このような過大な負荷が発生した場合に、プレイヤに違和感を生じさせることを抑制しつつ、負荷を軽減する処理を実行するようになっている。以下、ゲーム装置1での負荷軽減処理について詳述する。
なお、本実施の形態に係るゲーム装置1の説明において用いる幾つかの用語について、ここでまとめて概説しておく。まず、既に先行記載している「フレーム」とは、モニタ20に表示される動画の1コマを成す画像(静止画像)そのものを意味している。従って、例えば敵キャラクタC2が移動する様子は、該敵キャラクタC2の移動過程を断続的に示すフレーム(画像)を、所定のフレームレートでモニタ20に連続して表示することにより、動画として再生される。
また、このフレームを構成するためのデータ(レンダリング後のデータ)を「フレームデータ」と称している。このフレームデータをモニタ20に出力(描画)することで、フレームがモニタ20に表示される。更に、フレームデータには、「オブジェクトデータ」及び「環境データ」が含まれている。このうち「オブジェクトデータ」は、プレイヤキャラクタC1や敵キャラクタC2などの動的オブジェクトの状態(位置、姿勢、色彩など)を示すデータである。なお、プレイヤキャラクタC1や敵キャラクタC2には、腕や脚などに合計30箇所程度の関節が設定されており、オブジェクトデータとして、これら全ての関節に対応する角度データや、各キャラクタの仮想ゲーム空間上での位置を示す位置データなど、キャラクタの生成に必要な情報が設定されている。他方、「環境データ」は、これらのキャラクタC1,C2の周辺環境を構成するもの、例えば、建物などの仮想ゲーム空間を構成する静的オブジェクトC3、戦闘時の様子を視覚的に表現する爆風や火花などのパーティクル、木の葉のような平面的なオブジェクト、遠近感を演出するための「もや」、プレイヤキャラクタC1の体力ゲージ、などを示すデータである。
[制御部の機能的構成]
図4は、ゲーム装置1が備える制御部8の機能的な構成を示すブロック図であり、特に、負荷軽減処理に関連性の高い機能について示している。制御部8は、図1を用いて説明したように、メモリコントローラ2、CPU3、GPU4、メインメモリ5、DSP6、及びARAM7を備えており、光ディスク23に記録されたゲームプログラム24及びゲームデータを読み込んで実行することにより、以下に説明するような、フレーム生成手段51、ID情報更新手段52、負荷検出手段53、負荷軽減手段54、及びオブジェクト復元手段55としてゲーム装置1を機能させる。
フレーム生成手段
フレーム生成手段51は、本ゲームの動画を構成するフレーム40を所定のフレームレートで生成するものであり、即ち、フレーム40を示すフレームデータを算出する処理と、このフレームデータをモニタ20へ出力する処理とを行う。そして、このようにフレーム40を生成するために、フレーム生成手段51は、オブジェクトデータ更新手段51a、環境データ更新手段51b、及びフレームデータ出力手段51cを備え、ゲーム装置1を以下のように機能させる。
まず、オブジェクトデータ更新手段51aは、フレーム40に含まれる動的オブジェクトについて、該動的オブジェクトの状態(位置、姿勢、色彩など)を示すオブジェクトデータの更新処理をゲーム装置1に実行させるものである。より具体的に説明すると、動的オブジェクトである敵キャラクタC2には、個体毎に思考パターンが設定されており、各敵キャラクタC2はこの思考パターンに基づいて動作(移動、攻撃など)する。
この思考パターンには、攻撃型、防御型、又は、攻撃型及び防御型の夫々の特性を兼ね備えたバランス型などがあり、敵キャラクタC2がどのような役割(行動特性)に基づいて仮想ゲーム空間41内を行動するかを定めるものである。そして、敵キャラクタC2は自身の思考パターンに基づいて行動(動作)を決定する。例えば、攻撃型の思考パターンを有する敵キャラクタC2の場合、攻撃に関する動作が選択されやすく設定されている。具体的には、プレイヤキャラクタC1に対して攻撃をするために移動動作を選択(移動モーション動作を実行)し、プレイヤキャラクタC1に所定距離まで接近すると、次に、刀でプレイヤキャラクタC1に斬りつけるなどの攻撃動作を選択(攻撃モーション動作を実行)する。そしてこのように選択されたモーション動作を実行するに際し、オブジェクトデータ更新手段51aは、選択されたモーション動作に対応して、フレーム単位で予め設定されている敵キャラクタC2のモーションデータ(位置(座標)及び姿勢を示すデータ)から、該当するフレームに対応するモーションデータを読み出し、読み出したモーションデータに基づいて敵キャラクタC2の位置及び姿勢を示すオブジェクトデータを更新する(アニメーション動作させる)。
なお、上記のような各モーション動作(移動モーション動作や攻撃モーション動作など)には、敵キャラクタC2の「位置の更新(変化)」と、腕や脚を曲げたり身体の向きを左右に変更したりするような「姿勢の更新(変化)」とを含んでいる。このモーション動作を示すモーションデータは、光ディスク23に記憶されたゲームデータに含まれており、ディスクドライブ16によって読み込まれてメインメモリ5に格納されている。そして、各敵キャラクタC2のモーション動作に対応するモーションデータが制御部8で処理されることにより、各敵キャラクタC2について該モーションデータに対応するモーション動作(アニメーション)が再生されるようになっている。
上記モーションデータ及びモーション動作について更に詳述する。モーションデータは、再生されるモーション(アニメーション)の1コマ(1フレーム)毎の敵キャラクタC2の位置及び姿勢を決定するデータである。このモーションデータには、モーション動作毎に1フレーム毎の敵キャラクタC2の位置を示す位置データ(移動量)と、関節(腕や脚などの関節)の角度(各関節に対応付けられた親関節からみたときの各関節の相対的な角度)を示す角度データとが予め記憶されている。そして、位置データに基づいて仮想ゲーム空間41内での敵キャラクタC2の位置が決定され、角度データに基づいて敵キャラクタC2の姿勢が決定される。なお、モーションデータには、敵キャラクタC2の全ての関節に対応する角度データが設定されている。
このように、モーションデータに基づいて決定される各敵キャラクタC2の位置及び姿勢を、連続する各フレーム40において逐次決定して表示することにより、各敵キャラクタC2の連続したモーション動作(即ち、移動や攻撃といった動作を示すアニメーション)が再生されるようになっている。
なお、オブジェクトデータ更新手段51aは、上記のように1フレーム毎にモーションデータに設定された位置データや角度データを読み出し、これに基づいて各フレーム40のオブジェクトデータを更新(算出)する。また、オブジェクトデータ更新手段51aによるオブジェクトデータの更新は、原則的にフレームの生成毎に行うため、フレームレート(60fps)と同じく本実施の形態では60回/秒である。但し、後述するように更新頻度低減処理(図7参照)を実行した場合には、少なくとも一部のオブジェクトデータ(本実施の形態では、角度データにより更新される姿勢、即ち、モーション動作)について、その更新頻度が低減されることとなる。また、以下の説明では、フレームレートとオブジェクトデータの更新頻度とを区別するために、フレームレートは[fps]の単位で示し、オブジェクトデータの更新頻度は[回/秒]の単位で示している。また、上記の通り本実施の形態では、更新頻度低減処理にてオブジェクトデータの角度データ(姿勢を示すデータ)の更新頻度が低減される。即ち、モーション動作の更新頻度が低減されることとなる。従って以下では、オブジェクトデータのうち角度データの更新と、モーション動作(即ち、姿勢)の更新とを、略同義のものとして用いる。
また、プレイヤキャラクタC1についても、プレイヤの操作に対応するモーションデータを読み出し、読み出したモーションデータに基づいてプレイヤキャラクタC1の位置や姿勢(オブジェクトデータ)を更新する。
環境データ更新手段51bは、フレーム40毎(60回/秒)に、仮想ゲーム空間41を構成するオブジェクトや文字情報など、上記動的オブジェクトの周辺環境の画像を示す環境データの更新処理をゲーム装置1に実行させるものである。具体的に説明すると、環境データ更新手段51bは、仮想ゲーム空間41を構成する建築物などのオブジェクトの状態(位置、姿勢、色彩など)を示すデータを算出し、該オブジェクトを示す環境データを、算出したデータに更新する。なお、上述したように各キャラクタC1,C2や建築物など、不透明なオブジェクトを示すデータを算出する処理を、以下では「ソリッド処理」と称する。
また環境データ更新手段51bは、フレーム40に含まれる木の葉などの平面的なオブジェクトの状態を示すデータを算出し(以下、「ヌキ処理」)、また、仮想ゲーム空間41を構成する透明なオブジェクトの状態を示すデータを算出する(以下、「トランスペアレンシー処理」)。また、戦闘シーンでの爆風や火花等の粒子状のもの(パーティクル)の状態を示すデータの算出(以下、「エフェクト処理」)や、「もや」を表現する場合のようにフレーム40の全体を補正する場合の補正値を示すデータの算出(以下、「フィルタ処理」)も実行する。更に、プレイヤキャラクタC1の体力値や体力ゲージなど、他のオブジェクトに対して最も仮想カメラに近い位置に表示する二次元画像データの算出(以下、「スクリーン処理」)も実行する。
上述したように、オブジェクトデータ更新手段51a及び環境データ更新手段51bにより算出された各データによって、フレーム40を示すフレームデータが構成される。そして、算出されたフレームデータは、メインメモリ5内に設定されたフレームバッファ(図示せず)に書き込まれる。
次に、フレームデータ出力手段51cは、フレームバッファに書き込まれたフレームデータに基づいて、フレーム40をモニタ20に表示するものである。即ち、フレームデータ出力手段51cは、GPU4により、フレームバッファに書き込まれたフレームデータを読み出し、これをビデオI/F11を介してモニタ20へ出力する。これにより、可視画像であるフレーム40がモニタ20に表示される。
このようにフレーム生成手段51は、オブジェクトデータの算出・更新、環境データの算出・更新、及び、これにより得られたフレームデータの出力を、ゲーム装置1に実行させる。
ID情報更新手段
フレーム40に含まれる敵キャラクタC2の夫々には、固有のID情報が設定されており、このID情報は、ID情報更新手段52によって、フレーム40毎に更新されるようになっている。ID情報としては、敵キャラクタC2の名称、敵キャラクタC2の種類(ボスキャラクタ、雑魚キャラクタなど)に基づいて設定された重要度を示す情報、仮想ゲーム空間41内での位置情報、身体の向きを示す角度情報、オブジェクトデータの更新頻度(即ち、モーション動作の更新頻度)を示す情報、及びソート優先度(後述)に関する情報などが含まれている。このうち位置情報及び角度情報は、思考に基づき行動する敵キャラクタC2について算出したオブジェクトデータから取得し、フレーム40毎に最新の情報に更新される。また、名称、及び重要度を示す情報については、一の敵キャラクタC2に対して固定的に設定され、同一の敵キャラクタC2についてフレーム40毎には更新されないようになっている。更に、オブジェクトデータの更新頻度(モーション動作の更新頻度)を示す情報については、後述する負荷軽減処理及び復元処理の実行により、適宜更新される。なお、ID情報に含まれる各情報の詳細については、以下で適宜説明する。
負荷検出手段
負荷検出手段53は、フレーム40を生成するのに要する制御部8の負荷を検出するものであり、本実施の形態では、フレームレートの測定値が基準値よりも小さい所定の閾値以下であった場合に、過大な負荷が生じていると判定する。より具体的に説明すると、オブジェクトデータの更新処理(モーション動作の更新処理)の開始時点から該更新処理の終了時点までに要した時間を、CPU3のクロックを用いて計測し、この時間からフレームレートの測定値を算出する。そして、本実施の形態のようにフレームレートの基準値が60fpsであれば、例えば測定値が58fps以下であった場合に、過大な負荷が生じていると判定するようになっている。
負荷軽減手段
制御部8が備える負荷軽減手段54は、負荷検出手段53によって過大な負荷が生じていると判定された場合に実行され、複数の敵キャラクタC2のうちの一部を対象に、フレーム40から削除して非表示にしたり、オブジェクトデータの更新頻度(モーション動作の更新頻度)を低減したりするなどして、制御部8の負荷を軽減するものである。
即ち、ゲーム装置1がその処理能力以下で動作している通常の状態においては、敵キャラクタC2等の動的オブジェクトに関するオブジェクトデータの更新頻度(モーション動作の更新頻度)は、フレーム40が生成されるのと同じ頻度(即ち、本実施の形態ではフレームレートの基準値の周期と等しい60回/秒)とされる。一方、過大な負荷が生じた場合には負荷軽減手段54により、一部の敵キャラクタC2を非表示として制御部8の負荷を軽減し、それでも過大な負荷が生じた場合には、一部の敵キャラクタC2を対象に、そのオブジェクトデータの更新頻度(モーション動作の更新頻度)を小さく設定(例えば、30回/秒)して、制御部8の負荷を軽減する。更に、これでもまだ過大な負荷が生じた場合には、オブジェクトデータの更新頻度(モーション動作の更新頻度)を更に小さく設定(例えば、15回/秒)して制御部8の負荷を低減する。
なお、本実施の形態では、上記のように更新頻度を小さく設定するオブジェクトデータとして、既に説明した角度データを対象とし、モーション動作の更新(姿勢の更新)の頻度を小さくすることとしている。一方、更新頻度を小さく設定するオブジェクトデータとして位置データは含まないようにしており、従って位置の更新頻度は変更しないこととしている。そのため、本実施の形態では更新頻度が低減された敵キャラクタC2であっても、その仮想ゲーム空間41内での位置は思考パターンに応じてフレーム40毎に変化し、例えば手足を振るような移動モーション動作の再生処理を行う頻度だけが低減されるようになっている。但し、位置データも含めたオブジェクトデータを対象に、その更新頻度を小さく設定するようにし、モーション動作(姿勢)に加えて位置も更新頻度を変更できるようにしてもよい。
このような処理を実行するため、図4に示すように負荷軽減手段54は、オブジェクト選択手段54a、更新頻度低減手段54b、動的オブジェクト削除手段54c、及び静的オブジェクト削除手段54dを備えている。
このうちオブジェクト選択手段54aは、ID情報に含まれるソート優先度に基づいて、非表示又はモーション動作の更新頻度低減の対象(以下、「負荷軽減対象」)とする敵キャラクタC2を選択するものである。また、更新頻度低減手段54bは、選択された敵キャラクタC2について、モーション動作(姿勢)の更新頻度を上述したように二段階に分けて低減するものであり、動的オブジェクト削除手段54cは、選択された敵キャラクタC2を非表示にするものである。更に、静的オブジェクト削除手段54dは、仮想カメラの視野に入る静的オブジェクトの一部を非表示にするものである。なお、動的オブジェクト削除手段54cによって非表示状態となっている敵キャラクタC2については、非表示のままで移動(位置の更新)は行うものの、モーション動作の再生(姿勢の更新)は行わない。即ち、この非表示状態の敵キャラクタC2については、そのオブジェクトデータのうち、位置データの更新(位置の更新)は行うが、角度データの更新(モーション動作の更新)は行われない。
ここで、上記ID情報に含まれるソート優先度は、各敵キャラクタC2が負荷軽減対象として選択される優先順位を示すものである。例えば、下式(1)に示すように、敵キャラクタC2の種類(ボスキャラクタ、雑魚キャラクタなど)に基づいて設定された補正値A1、仮想カメラからの距離に基づいて設定された補正値A2、及びその他の様々の要因に基づいて設定された補正値A3をパラメータとして、ソート優先度は決定される。また、このような式(1)に示される方法に従って、ソート優先度はID情報更新手段52によりフレーム40毎に更新される。
本実施の形態では、敵キャラクタC2の種類に応じて重要度が設定されており、重要度が高いキャラクタほど補正値A1として大きな数値が割り当てられている。例えば、ボスキャラクタは雑魚キャラクタよりも重要性が高いため、より大きな補正値A1が割り当てられている(詳細は後述)。また、仮想カメラからの距離(各敵キャラクタC2の位置情報から算出する)が小さい敵キャラクタC2ほど、補正値A2として大きな数値が設定されるようになっている。また、上記A1,A2の他、様々の要因に基づいてソート優先度を決定する補正値をここでは「補正値A3」で代表させているが、例えば、プレイヤキャラクタC2によって掴まれている状態の敵キャラクタC2や、空中に位置している状態の敵キャラクタC2については、補正値A3として大きな数値が割り当てられるようになっている。そして、このような補正値を使って式(1)によりソート優先度を決定し、このソート優先度の値が大きい敵キャラクタC2ほど優先順位が低く、即ち、負荷軽減対象として選択されにくくなっている。換言すれば、ソート優先度が小さいほど、負荷軽減対象として選択される優先順位が高くなっている。
また、既に説明したように、本実施の形態ではフレーム40に最大30体の敵キャラクタC2を含める(表示する)ことができる。そして、ソート優先度は、フレーム40に含まれる全ての敵キャラクタC2に対して設定される。また、フレーム40に含まれていなかった(モニタ20に表示されていなかった)敵キャラクタC2が、新たにフレーム40に含まれることとなった場合には、上式に基づいてこの敵キャラクタC2のソート優先度が決定される。そして、制御部8の負荷が過大になったときは、このソート優先度に基づいて敵キャラクタC2が選択され、選択された敵キャラクタC2は、動的オブジェクト削除手段53dによってフレーム40から削除され、又は、更新頻度低減手段53cによって該敵キャラクタC2のモーション動作の更新頻度が低減される。
図5は、フレーム40に含め得る最大30体の敵キャラクタC2について設定されたソート優先度を例示する模式図である。なお、この図5では理解の容易のために、仮想カメラからの距離に基づいて設定された補正値A2以外の補正値A1,A3は、全ての敵キャラクタC2において同じ値である場合について例示している。即ち、ここに示された敵キャラクタC2(図5中では「NPC01」〜「NPC30」と表示)は、実質的に仮想カメラからの距離のみに基づいてソート優先度が決定されている。従って、仮想カメラに近い敵キャラクタC2ほど、ソート優先度が高くなっており、図5ではソート優先度が高い順に、NPC01〜NPC30の敵キャラクタC2が配置されている。
図5に示すように、本実施の形態では、ソート優先度が高い方から順に所定数(図5では、NPC01〜NPC05の5体)の敵キャラクタC2については、非表示又はモーション動作の更新頻度低減の対象に含めない、「負荷軽減非対象」としている。これにより、仮想カメラの近くに位置し、プレイヤが注視する5体の敵キャラクタC2(NPC01〜NPC05)は、滑らかな(フレームレートの基準値と同程度の頻度でモーション動作が更新される)動画で常にモニタ20に表示されることとなる。
また、負荷軽減対象であるNPC06〜NPC30の25体の敵キャラクタC2のうち、ソート優先度が低い方から順に所定数(図5では、NPC26〜NPC30の5体)の敵キャラクタC2については、負荷が過大になったときに動的オブジェクト削除手段53dによってフレーム40から削除される「削除対象」とされている。そして、負荷軽減対象のうち削除対象を除いたNPC06〜NPC25の20体の敵キャラクタC2が、更新頻度低減手段53cによってモーション動作の更新頻度が低減される「更新頻度低減対象」とされている。
なお、フレーム40に含まれる敵キャラクタC2が30体に満たない場合もある。例えば、フレーム40に28体(NPC01〜NPC28)の敵キャラクタC2が含まれる場合は、上記と同様にソート優先度の高い順に5体(NPC01〜NPC05)の敵キャラクタC2が「負荷軽減非対象」となり、次にソート優先度の高い順に20体(NPC06〜NPC25)の敵キャラクタC2が「更新頻度低減対象」となる。そして、ソート優先度の低い残りの3体(NPC26〜NPC28)だけが「削除対象」となる。
更に、フレーム40に含まれる敵キャラクタC2が25体に満たない場合、例えば、21体(NPC01〜NPC22)であった場合は、上記と同様にソート優先度の高い順に5体(NPC01〜NPC05)の敵キャラクタC2が「負荷軽減非対象」となる。そして、次にソート優先度の高い順に16体(NPC06〜NPC22)の敵キャラクタC2が「更新頻度低減対象」となり、「削除対象」とされる敵キャラクタC2は存在しない。
ところで、実際にソート優先度を決定する要因は、既に説明したように仮想カメラからの距離だけでなく、敵キャラクタC2の種類も一因となる。この点について詳説すると、敵キャラクタC2には、仮想ゲーム空間41内に多数出現する雑魚キャラクタの他、ゲームの進行上、倒さなければ進むことができないといった重要な位置付けにあるボスキャラクタや中ボスキャラクタなどが存在している。このように相対的に重要度の高い敵キャラクタC2については、仮想カメラからの距離が等しく相対的に重要度の低い敵キャラクタC2に比べて、ソート優先度は高く設定される。
従って、このように重要度の高い敵キャラクタC2が存在している場合には、仮想カメラに近い5体の敵キャラクタC2のうち遠い方の敵キャラクタC2に優先して、重要度の高い敵キャラクタC2が負荷軽減非対象とされる場合がある。例えば、重要度の低い雑魚キャラクタが仮想カメラの近くに5体位置し、更に仮想カメラから離れる方向にボスキャラクタが位置している場合について説明する。このとき、距離に関する補正値A2については、5体目の雑魚キャラクタの方がボスキャラクタよりも大きい数値となるが、種類(即ち、重要度)に関する補正値A1については、5体目の雑魚キャラクタよりもボスキャラクタの方が大きい数値となる。従って、上述した式に基づいてソート優先度を算出した結果、5体目の雑魚キャラクタよりもボスキャラクタの方がソート優先度が高くなる場合がある。この場合には、仮想カメラから4体目までの雑魚キャラクタとボスキャラクタとが負荷軽減非対象とされ、仮想カメラから5体目の雑魚キャラクタは負荷軽減対象とされる。
ところで、フレーム40に含まれていた敵キャラクタC2のうちの一部が、プレイヤキャラクタC1又は敵キャラクタC2の移動や、仮想カメラの視点の移動によって、フレーム40から外れてしまう場合がある。この敵キャラクタC2については、再表示されるまでは関節の角度に関するモーション動作の更新処理は行われない。従って、非表示の状態で位置の更新は行われるが、モーション動作の再生は行われない。また、この敵キャラクタC2については、名称及び重要度を示す情報の他、非表示となった後にフレーム40毎に更新される位置情報、及び非表示となった時点の角度情報がID情報として管理される。そして、仮想カメラの視点の移動などにより、管理されている位置情報の示す位置が、再びフレーム40内に含まれることになった場合には、フレーム生成手段51により、この位置で非表示状態の敵キャラクタC2を再び表示させる。そして、再表示された敵キャラクタC2は、自己の思考パターンに基づくモーション動作を再開し、その後はソート優先度がフレーム40毎に更新される。このようにして再表示された敵キャラクタC2についても、その後に過大な負荷が検出され、このソート優先度に基づいて負荷軽減対象として選択された場合は、再び非表示とされ、又はモーション動作の更新頻度が低減される。
また、本実施の形態に係る制御部8は、過去に表示した所定数(例えば、120体)の敵キャラクタC2について、そのID情報を管理している。即ち、本ゲームでは、プレイヤの操作に応じてプレイヤキャラクタC1が仮想ゲーム空間41内を進み、次々に出現してくる敵キャラクタC2を倒しながら更に進んで行く。この際、既に倒された敵キャラクタC2であっても、最新に出現した敵キャラクタC2から数えて過去120体目までの敵キャラクタC2については、名称、重要度を示す情報、位置情報、及び角度情報などのID情報を管理している(但し、更新はされない)。なお、プレイヤキャラクタC1によって倒された敵キャラクタC2は、所定の時間が経過するか、又は、一旦仮想カメラの視界から外れると非表示とされる。
また、現時点でID情報を管理している敵キャラクタC2が120体存在している場合には、次に新たな敵キャラクタC2を出現させる際、最も古いID情報(120体目の敵キャラクタC2のID情報)の管理を終了し、新たに出現させる敵キャラクタC2のID情報の管理を開始する。但し、ボスキャラクタなどの重要度の高い敵キャラクタC2については、そのID情報の管理を終了させないこととしている。
オブジェクト復元手段
制御部8はオブジェクト復元手段55を備えている。このオブジェクト復元手段55は、負荷軽減手段54により、一部の敵キャラクタC2が非表示とされたり、又はそのモーション動作の更新頻度が低減されたりしている状態(以下、「負荷軽減状態」)で、制御部8によるフレーム40の生成に要する負荷が過大ではなくなった場合に、敵キャラクタC2を負荷軽減状態から復元させるものである。
より具体的に説明すると、オブジェクト復元手段55は、復元対象選択手段55aを備えている。復元対象選択手段55aは、負荷軽減状態にある敵キャラクタC2のうち、復元対象とする敵キャラクタC2を、ソート優先度に基づいて決定する。例えば、負荷軽減状態にある敵キャラクタC2が複数存在する場合、ソート優先度の高いものから優先して復元対象として選択する。オブジェクト復元手段55は、こうして選択された敵キャラクタC2について、非表示とされていた場合には再表示し、更新頻度が低減されていた場合にはそれを元に戻す。
[フレーム生成フロー]
図6は、上述した機能を有するゲーム装置1が、1つのフレーム40を生成する過程を示すフローチャートである。これに示すように、ゲーム装置1は、はじめにID情報更新手段52によって、敵キャラクタC2のID情報の更新処理を行う(ステップS1)。具体的に説明すると、敵キャラクタC2は自己の思考パターンに基づいて行動するため、フレーム40毎に立ち位置や向きが変更され、これに伴ってソート優先度も変更される。そこで、次回のフレーム40を生成するにあたって、敵キャラクタC2のID情報を前回のフレーム40に基づいて更新する。具体的には、前回のフレーム40における仮想ゲーム空間41内での位置情報、身体の向きを示す角度情報、式(1)に基づいて算出されるソート優先度、などのID情報を更新する。一方、同一の敵キャラクタC2においてはその名称や重要度は変更されないため、これらのID情報は更新されずに同一内容が維持される。
ID情報が更新されると、負荷検出手段53によって、前回のフレーム40の生成時におけるフレームレートの測定値を取得し、これを所定の閾値(例えば、58fps)と比較する(ステップS2)。そして、測定値が閾値以下であって負荷が過大であると判定された場合(ステップS2:YES)は負荷軽減処理を実行し(ステップS3)、閾値より大きくて負荷が過大ではないと判定された場合(ステップS2:NO)は復元処理を実行する(ステップS4)。このように、フレームレートの測定値に基づいて負荷軽減処理又は復元処理を行うことで、次のフレーム40に含まれる敵キャラクタC2について、何れを非表示とするか、及び、何れの敵キャラクタC2を対象にモーション動作の更新頻度をどう設定するか、が決定される。この負荷軽減処理及び復元処理の具体的な内容については、図7〜図12を参照して後述する。
次に、フレーム生成手段51によって、既に説明したように不透明なオブジェクトを示すデータを算出するソリッド処理(ステップS5)、平面的なオブジェクトの状態を示すデータを算出するヌキ処理(ステップS6)、透明なオブジェクトを示すデータを算出するトランスペアレンシー処理(ステップS7)、戦闘シーンを表現するパーティクルを示すデータを算出するエフェクト処理(ステップS8)、「もや」等を表現する補正値を示すデータを算出するフィルタ処理(ステップS9)、及び体力ゲージ等の二次元画像データを算出するスクリーン処理(ステップS10)が順次実行される。
これらのステップS5〜S10の処理(これらの処理は、まとめて「レンダリング処理」と称される)を実行することで、次回にモニタ20に表示するフレーム40を示すフレームデータを取得する。そして、このフレームデータに基づき、フレームデータ出力手段51cがモニタ20にフレーム40を表示する。このようなステップS1〜S10の処理を、1つのフレーム40毎に、即ち、本実施の形態では60fpsというフレームレートで繰り返し実行する。
なお、図6には示していないが、制御部8は、フレーム40に含まれる敵キャラクタC2及びプレイヤキャラクタC1について、「当たり判定処理」をフレーム40毎に適宜タイミングで実行する。この当たり判定処理では、プレイヤキャラクタC1による攻撃が敵キャラクタC2にヒットしたか否か、及び、敵キャラクタC2による攻撃がプレイヤキャラクタC1にヒットしたか否かを判定する。そして、ヒットしたと判定した場合には、ヒットしたことを表現するパーティクル(火花など)などのデータを、エフェクト処理(ステップS8)により算出する。
[負荷軽減処理フロー]
次に、ステップS3の負荷軽減処理を実行する際のゲーム装置1の動作について説明する。図7は、ゲーム装置1が負荷軽減処理を実行する過程を示すフローチャートである。本実施の形態に係るゲーム装置1では、既に説明したように、過大な負荷が生じた場合、一部の敵キャラクタC2(NPC26〜NPC30)をソート優先度に基づき順に非表示とし、それでも過大な負荷が生じた場合には、一部の敵キャラクタC2(NPC06〜NPC25)を対象に、そのモーション動作(姿勢)の更新頻度を60回/秒から30回/秒に順に設定し直す。更に、これでもまだ過大な負荷が生じた場合には、上記敵キャラクタC2(NPC06〜NPC25)のモーション動作の更新頻度を、30回/秒から15回/秒に順に設定し直す。以下、このようにして制御部8の負荷を低減する負荷軽減処理の動作フローについて詳説する。
図7に示すように、負荷軽減処理ではステップS1(図6参照)で更新されたID情報を取得し(ステップS20)、その中に含まれる各敵キャラクタC2の位置情報に基づき、フレーム40内に何体の敵キャラクタC2が含まれているかを判定する(ステップS21)。その結果、26体以上であると判定した場合(ステップS21:NO)は、オブジェクト選択手段54aにより、そのうちで最もソート優先度の低い1体の敵キャラクタC2を選択し(ステップS22)、動的オブジェクト削除手段54cによってこの敵キャラクタC2を「削除対象」として決定する(ステップS23)。
従ってこの場合、前回のフレーム40に含まれていた敵キャラクタC2のうち、最もソート優先度の低い1体の敵キャラクタC2は、負荷軽減処理(図6のステップS3)後に行うソリッド処理(図6のステップS5)の対象とならず、次回のフレーム40では削除されて非表示状態となる。図8は、負荷軽減処理を説明するための模式図であり、(a)は削除処理の例、(b)及び(c)は更新頻度低減処理の例を示している。この図8(a)に示すように、前回のフレーム40に28体(即ち、26体以上)の敵キャラクタC2(NPC01〜NPC28)が含まれ、過大な負荷が検出された場合には、最もソート優先度の低い敵キャラクタC2(NPC28)が次回のフレーム40では非表示とされる。
これにより、削除された敵キャラクタC2については、ソリッド処理(図6のステップS5)にて関節の角度に関するモーション動作を算出する必要がなく、当たり判定処理やエフェクト処理(図6のステップS8)を行う必要もないため、制御部8の負荷を軽減することができる。また、この敵キャラクタC2が表示されない分、フレームデータのデータ量が小さくなるため、レンダリング処理(ステップS5〜S10の処理)やモニタ20へのデータの出力に要する制御部8の負荷も軽減することができる。なお、前述したように、敵キャラクタC2が非表示状態とされた場合であっても、その位置データは更新され、更新毎の位置情報を含むID情報は120体分まで管理される。
一方、ステップS21にて敵キャラクタC2が25体以下であると判定した場合(ステップS21:YES)は、補正処理を実行する(ステップS24)。この補正処理について、ここでは概要だけ説明し、詳細については便宜上あとで説明する(図10〜図11参照)。負荷軽減処理では、この後にステップS25〜S31で説明するように、モーション動作の更新頻度を低減する敵キャラクタC2を、ソート優先度に基づいて選択する。一方で、各敵キャラクタC2は自己の思考パターンに基づいて行動し、相対的な位置関係がフレーム40毎に変化するため、ステップS20で更新されるソート優先度も、フレーム40毎に変化する。その結果、前回のフレーム40にて更新頻度低減対象であった敵キャラクタC2と、最新のソート優先度から更新頻度低減対象として選択される敵キャラクタC2とが一致しない場合がある。そこで補正処理(ステップS24)では、最新のソート優先度によれば更新頻度がより高く設定されるべき敵キャラクタC2について、最新のソート優先度に基づいて更新頻度を更新(再設定)するものである。簡単に言えば、ステップS25〜S31での更新頻度低減処理に先だって、最新のソート優先度に照らして更新頻度が低すぎる敵キャラクタC2を対象に、その更新頻度を適正値に補正するものである。
続いて、このステップS24の補正処理の後の動作について説明すると、ゲーム装置1は、オブジェクト選択手段54aによって、更新頻度が60回/秒の敵キャラクタC2の中からソート優先度が最も低い1体の敵キャラクタC2を選択する(ステップS25)。そして、この敵キャラクタC2が負荷軽減非対象であるか否か、即ち、ソート優先度に関して上位5体に含まれる敵キャラクタC2であるか否かを判定する(ステップS26)。その結果、図8(b)に示す例のようにこの敵キャラクタC2(NPC07)が負荷軽減非対象でない場合(ステップS26:NO)は、この敵キャラクタC2のモーション動作の更新頻度を、現状の60回/秒から低減し、30回/秒に設定する(ステップS27)。
一方、ステップS25で選択した敵キャラクタC2が、負荷軽減非対象であった場合(ステップS26:YES)は、この選択を解除し(ステップS28)、更新頻度が30回/秒の敵キャラクタC2が存在するか否かを判定する(ステップS29)。ここで、更新頻度が30回/秒の敵キャラクタC2が存在しない場合(ステップS29:NO)とは、敵キャラクタC2が負荷軽減非対象である5体以下であるか、この5体の他に15回/秒の敵キャラクタC2のみしか存在しない状態を意味する。そして、この場合(ステップS29:NO)には、何れの敵キャラクタC2の更新頻度も低減せずに、負荷軽減処理を終了する。
これに対し、図8(c)に示す例のように、更新頻度が30回/秒の敵キャラクタC2(NPC06〜NPC15)が存在する場合(ステップS29:YES)には、その中からソート優先度が最も低い1体の敵キャラクタC2(NPC15)を選択する(ステップS30)。そして、この敵キャラクタC2のモーション動作の更新頻度を、現状の30回/秒から低減し、15回/秒に設定する(ステップS31)。
上記ステップS27,S31のように、敵キャラクタC2のモーション動作の更新頻度を低く設定することにより、制御部8での負荷を軽減することができる。即ち、これらの敵キャラクタC2については、以前の半分の頻度で関節の角度に関するオブジェクトデータの更新(モーション動作の更新)をすればよいため、これらの敵キャラクタC2についてのモーション動作の更新に要する負荷が半減する。
図9は、60fpsで生成された連続するフレーム40(401〜404)を示す模式図であり、更新頻度が60回/秒、30回/秒、及び15回/秒の敵キャラクタC2が表示されている。また、ここでは図示の便宜上、60回/秒の敵キャラクタC2(NPC01)を1体、30回/秒の敵キャラクタC2(NPC05,NPC06)を2体、15回/秒の敵キャラクタC2(NPC21)を1体、の計4体だけを表示している。また、理解の容易のため、各敵キャラクタC2(NPC01,NPC05,NPC06,NPC21)が、何れも同一のモーション動作(刀を振り下ろす動作)をしている状態を示し、姿勢が同じ敵キャラクタC2には、その胸の部分に同一符号(a,b,c,d,z)を付している。
まず、更新頻度が60回/秒の敵キャラクタC2(NPC01)についてみると、この敵キャラクタC2は、フレーム40毎にモーション動作が更新されるため、図9のフレーム401〜404の全てにおいて、動作過程の1/60[秒]ごとの状態が表示されている。
一方、更新頻度が30回/秒の敵キャラクタC2(NPC05,NPC06)の場合、その動作過程の1/30[秒]ごとの状態が表示される。具体的には、図9に示すように、一方の敵キャラクタC2(NPC05)については、フレーム401,403においてモーション動作が更新されており、更新されたデータに基づく画像が表示されている。そして、フレーム402では、関節の角度に関してフレーム401と同じモーション動作(姿勢)を用いて画像が表示され、フレーム404では、関節の角度に関してフレーム403と同じモーション動作(姿勢)を用いて画像が表示されている。その結果、この敵キャラクタC2(NPC05)は、フレーム401〜404の順に、「姿勢変化後の状態」、「姿勢不変状態」、「姿勢変化後の状態」、「姿勢不変状態」が表示される。なお、本実施の形態では、敵キャラクタC2の位置データはフレーム40毎に更新するため、前のフレーム40からの姿勢が変わらないフレーム402,404においても、該敵キャラクタC2(NPC05)の仮想ゲーム空間41内での位置は変化する。
また、他方の敵キャラクタC2(NPC06)については、フレーム402,404において関節の角度に関するモーション動作が更新されており、更新されたデータに基づく画像が表示されている。そして、フレーム401では、その直前のフレーム40(図示せず)と同じモーション動作(姿勢)を用いて画像が表示され、フレーム403では、フレーム402と同じモーション動作(姿勢)を用いて画像が表示されている。従って、この敵キャラクタC2(NPC06)は、フレーム401〜404の順に、「姿勢不変状態」、「姿勢変化後の状態」、「姿勢不変状態」、「姿勢変化後の状態」が表示される。なお、上記NPC05の場合と同様に、この敵キャラクタC2(NPC06)も、姿勢が変わらないフレーム401,403においても仮想ゲーム空間41内での位置は変化する。
このように、更新頻度が30回/秒の敵キャラクタC2が複数存在する場合には、全てのモーション動作の更新タイミングが一致しないように、適宜異ならせている。即ち、モーション動作が更新される敵キャラクタC2の数が、各フレーム40においてほぼ同数になるようにしている。これにより、多数の敵キャラクタC2について、全ての敵キャラクタC2が同一タイミングでモーション動作の更新処理が行われることによる負荷の増大を回避することができる。また、上記のように一方の敵キャラクタC2(NPC05)と他方の敵キャラクタC2(NPC06)とでは、「動作後の状態」が表示されるタイミングと「停止状態」が表示されるタイミングとが異なっている。これにより、更新頻度が30回/秒である複数の敵キャラクタC2の全てが、同時に「動作後の状態」や「停止状態」となることがなく、プレイヤに違和感が生じるのを抑制することができる。
また、更新頻度が15回/秒の敵キャラクタC2(NPC21)については、その動作過程の1/15[秒]ごとの状態が表示される。従って、図9に示すように、フレーム401〜403の生成時にはモーション動作が更新されずに「姿勢不変状態」となっており、前回の更新時から1/15[秒]経ったフレーム404の生成時に関節の角度に関するモーション動作が更新され、更新されたデータに基づく「姿勢変化後の状態」を示す画像がこのフレーム404に表示される。なお、更新頻度が15回/秒の敵キャラクタC2が複数存在する場合は、上記と同様に、モーション動作が更新される敵キャラクタC2の数が、各フレーム40においてほぼ同数になるようにしている。また、更新頻度が30回/秒の敵キャラクタC2(NPC05,06)と同様に、フレーム401〜403の「姿勢不変状態」であっても、仮想ゲーム空間41内での位置は変化するようになっている。
[補正処理]
次に、ステップ24で実行する補正処理について説明する。前述したように、補正処理は、ステップS25〜S31での更新頻度低減処理に先だって、最新のソート優先度に照らして更新頻度が低すぎる敵キャラクタC2を対象に、その更新頻度を適正値に補正するものである。また、モーション動作の更新頻度がより低いものから、優先的に補正処理の対象とするようになっている。以下、具体的に説明する。
図10は、ゲーム装置1が補正処理を実行する過程を示すフローチャートである。図10に示すように、はじめにフレーム40内にモーション動作の更新頻度が15回/秒の敵キャラクタC2が存在するか否かを判定する(ステップS40)。その結果、そのような敵キャラクタC2が存在すると判定した場合(ステップS40:YES)は、更新頻度が15回/秒の敵キャラクタC2の中からソート優先度が最も高い1体の敵キャラクタC2を選択する(ステップS41)。次に、この敵キャラクタC2よりもソート優先度が低く、更新頻度が60回/秒の敵キャラクタC2が存在するか否かを判定する(ステップS42)。そして、そのような敵キャラクタC2が存在すると判定した場合(ステップS42:YES)は、ステップS41にて選択した敵キャラクタC2について、更新頻度を15回/秒から60回/秒に補正する(ステップS43)。
図11は、更新頻度が適正値に補正される敵キャラクタC2の具体例を示す模式図である。この図11に基づいて、上述したステップS40〜S43の処理について具体的に例示する。なお、ここでは理解の容易のため、敵キャラクタC2のソート優先度は、仮想カメラからの距離のみに基づいて設定されるものとする。
前提として、図11に示すように、補正処理を行う時点を基準として前々回に生成したフレーム40にて、プレイヤキャラクタC1に近いものから順に、NPC01〜NPC25の25体の敵キャラクタC2が位置しており、この順に高いソート優先度が設定されていたとする。そして、この中で仮想カメラにより近い5体の敵キャラクタC2(NPC01〜NPC05)は、ソート優先度が高くて更新頻度は60回/秒に設定されている。次に仮想カメラに近い10体の敵キャラクタC2(NPC06〜NPC15)は更新頻度が30回/秒に設定され、その次に仮想カメラに近い10体の敵キャラクタC2(NPC16〜NPC25)は更新頻度が15回/秒に設定されている。そして、この状態から敵キャラクタC2が移動した結果、前回生成したフレーム40では、更新頻度が15回/秒であった敵キャラクタC2のうちNPC25が、更新頻度が60回/秒のNPC04とNPC05との間に割り込んで位置することになったとする。
このような前提状況で補正処理を実行した場合、まず、更新頻度が15回/秒の敵キャラクタC2(NPC16〜NPC25)が存在すると判定され(ステップS40:YES)、次に、この敵キャラクタC2の中から最もソート優先度の高い敵キャラクタC2としてNPC25が選択される(ステップS41)。即ち、この補正処理を実行する時点では、既に各敵キャラクタC2のID情報は更新されているため(図7のステップS20参照)、最新のソート優先度によると、更新頻度が15回/秒の敵キャラクタC2のうち、この時点で最も仮想カメラに近いNPC25が、最も高いソート優先度となっている。
そして、この敵キャラクタC2(NPC25)が移動した結果、更新頻度が60回/秒の敵キャラクタC2(NPC05)よりも仮想カメラの近くに位置することとなったため、敵キャラクタC2(NPC25)よりもソート優先度が低く更新頻度が60回/秒の敵キャラクタC2(NPC05)が存在すると判断される(ステップS42:YES)。そこで、この敵キャラクタC2(NPC25)について、更新頻度が15回/秒から60回/秒に補正される(ステップS43)。
なお、敵キャラクタC2(NPC25)に割り込まれた結果、仮想カメラから6体目に位置することとなった敵キャラクタC2(NPC05)は、補正処理が完了した時点では、更新頻度が依然として60回/秒に維持されている。但し、負荷軽減処理において補正処理に続いて行われるステップS26,S27の処理(図7参照)により、30回/秒の更新頻度に低減されることとなる。
ここで再び図10のフローチャートの説明に戻る。ステップS42において、更新頻度が60回/秒の敵キャラクタC2の中に、ステップS41で選択された敵キャラクタC2(更新頻度が15回/秒でソート優先度が最も高い敵キャラクタC2)よりもソート優先度が低いものが存在しない場合(ステップS42:NO)は、更新頻度が30回/秒の敵キャラクタC2の中に、ステップS41で選択された敵キャラクタC2よりもソート優先度が低いものが存在するか否かを判定する(ステップS44)。そして、そのような敵キャラクタC2が存在する場合(ステップS44:YES)は、ステップS41で選択した敵キャラクタC2について、更新頻度を15回/秒から30回/秒に補正する(ステップS45)。一方、そのような敵キャラクタC2が存在しない場合(ステップS44:NO)は、何れの敵キャラクタC2についても更新頻度を高くする補正は行わず、補正処理を終了する。
また、ステップS40において、更新頻度が15回/秒の敵キャラクタC2が存在しないと判定した場合(ステップS40:NO)は、更新頻度が30回/秒の敵キャラクタC2が存在するか否かを判定する(ステップS46)。そして、存在すると判定した場合(ステップS46:YES)は、そのうちで最もソート優先度の高い敵キャラクタC2を選択(ステップS47)し、更新頻度が60回/秒の敵キャラクタC2の中に、ステップS47で選択された敵キャラクタC2よりもソート優先度が低いものが存在するか否かを判定する(ステップS48)。例えば、更新頻度が30回/秒の敵キャラクタC2のうち最もソート優先度の高いものと比べて、仮想カメラから離れて位置しているためソート優先度が低い敵キャラクタC2の中に、更新頻度が60回/秒の敵キャラクタC2が存在するか否かを判定する。
その結果、そのような敵キャラクタC2が存在すると判定した場合(ステップS48:YES)は、ステップS47にて選択した敵キャラクタC2(更新頻度が30回/秒でソート優先度が最も高い敵キャラクタC2)の更新頻度を、30回/秒から60回/秒に補正する(ステップS49)。一方、ステップS46にて更新頻度が30回/秒の敵キャラクタC2が存在しないと判定した場合(ステップS46:NO)、及びステップS48にて該当する敵キャラクタC2が存在しないと判定した場合(ステップS48:NO)は、何れの敵キャラクタC2についても更新頻度を高くする補正は行わず、補正処理を終了する。
以上に説明したように、本ゲーム装置1に過大な負荷が発生したときに行う負荷軽減処理では、削除対象となり得る敵キャラクタC2が存在する場合(図7のステップS21:YES)には、その中の所定の敵キャラクタC2を削除することで負荷の軽減を図る(ステップS23)。一方、削除対象が存在しない場合(ステップS21:NO)は、まず、上述した補正処理を実行する(ステップS24)。これにより、最新のソート優先度に照らして更新頻度が低すぎる敵キャラクタC2を対象に、その更新頻度を適正値に補正する。そして、この補正処理を終えてから、図7のステップS25〜S31に示した手順で、所定の敵キャラクタC2の更新頻度を低減する処理を行い、負荷の軽減を図っている。
このように、まず一部の敵キャラクタC2を削除することで、ゲーム装置1の負荷を大きく軽減することができる。即ち、一般に敵キャラクタC2の更新頻度を低減するよりも、敵キャラクタC2を削除した方が、負荷の軽減量が大きい。従って、負荷が過大なときには、削除処理を優先して実行することで、処理落ち現象の発生を早期に抑制できる。一方、あまり多くの敵キャラクタC2を削除してしまうと、フレーム40内の敵キャラクタC2が少なくなって迫力に欠けるゲームとなるが、本実施の形態では、敵キャラクタC2が25体以下の場合に削除処理を行わないこととしているため、迫力のある戦闘シーンを表現することができる。また、敵キャラクタC2が25体以下の状態で負荷が過大になった場合であっても、所定の敵キャラクタC2のモーション動作の更新頻度を低減することで、ゲーム装置1の負荷を軽減することができる。
また、更新頻度を低減することで、モーション動作の次回更新時までの時間間隔は長くなるが、この間のフレーム40でも、更新頻度低減対象となった敵キャラクタC2は表示されている。例えば、図9に示した例で言えば、敵キャラクタC2(NPC01)の更新間隔が1/60[秒]であるのに対し、更新頻度が低減された敵キャラクタC2(NPC05)の更新間隔は1/30[秒]と大きくなっている。しかしながら、モーション動作が更新されないフレーム40(図9のNPC05について言えば、フレーム402,404)であっても、この敵キャラクタC2(NPC05)は非表示になるのではなく、1つ前のフレーム40のモーション動作に基づいて表示される。従って、プレイヤからは、負荷軽減処理による影響が判別しにくく、プレイヤに違和感を生じさせるのを抑制することができる。
しかも、式(1)から分かるように、削除対象や更新頻度低減対象となる敵キャラクタC2には、仮想カメラから遠くに位置するもの、即ち、フレーム40内にてより小さく表示されているものが優先して選択される。従って、このような点からも、プレイヤからは、負荷軽減処理による影響が判別しにくく、プレイヤに違和感を生じさせるのを抑制することができる。
[復元処理]
次に、図6のステップS4に示す復元処理について説明する。復元処理は、負荷検出手段53により検出した負荷が過大でなかった場合(図6のステップS2:NO)に、非表示又は更新頻度低減の対象となっている敵キャラクタC2について、その状態を復元するものである。また、復元対象とする敵キャラクタC2としては、負荷軽減処理の対象としての優先順位の低いものを優先し、即ち、復元処理を行う時点で更新頻度がより低くソート優先度のより高い敵キャラクタC2を優先的に選択する。以下、この復元処理について詳述する。
図12は、ゲーム装置1が復元処理を実行する過程を示すフローチャートである。図12に示すように、復元処理ではステップS1(図6参照)で更新されたID情報を取得し(ステップS60)、これに基づいてモーション動作の更新頻度が15回/秒の敵キャラクタC2が存在するか否かを判定する(ステップS61)。そして、このような敵キャラクタC2が存在する場合(ステップS61:YES)は、その中からソート優先度が最も高い敵キャラクタC2を選択し(ステップS62)、選択した敵キャラクタC2の更新頻度を15回/秒から30回/秒に復元する(ステップS63)。
また、ステップS61にて更新頻度が15回/秒の敵キャラクタC2が存在しないと判定した場合(ステップS61:NO)は、更新頻度が30回/秒の敵キャラクタC2が存在するか否かを判定する(ステップS64)。そして、このような敵キャラクタC2が存在する場合(ステップS64:YES)は、その中からソート優先度が最も高い敵キャラクタC2を選択し(ステップS65)、選択した敵キャラクタC2の更新頻度を30回/秒から60回/秒に復元する(ステップS66)。
また、ステップS64にて更新頻度が30回/秒の敵キャラクタC2が存在しないと判定した場合(ステップS64:NO)は、負荷軽減処理により前回生成したフレーム40にて削除されている敵キャラクタC2が存在するか否かを判定する(ステップS67)。そして、このような敵キャラクタC2が存在する場合(ステップS67:YES)は、その中からソート優先度が最も高い敵キャラクタC2を選択し(ステップS68)、選択した敵キャラクタC2の削除状態を解除する(ステップS69)。
また、ステップS67にて、削除されている敵キャラクタC2が存在しないと判定した場合(ステップS67:NO)は、フレーム40内の全ての敵キャラクタC2の更新頻度が60回/秒であり、且つ削除されている敵キャラクタC2が存在しないこととなる。そのため、何れの敵キャラクタC2についても、非表示状態の解除や更新頻度を高める、といったことは行わず、復元処理を終了する。
このような復元処理を実行することにより、負荷が過大でなくなった場合に、非表示又は更新頻度低減の対象となっている敵キャラクタC2について、その状態を復元することができる。また、更新頻度がより低い敵キャラクタC2を優先的に選択して復元対象とするため(ステップS61参照)、復元処理後には、更新頻度の高い敵キャラクタC2がより多くなり、多くの敵キャラクタC2の動作をより滑らかな(フレームレートの基準値と同程度の頻度で更新される)動画として表示することができる。また、ソート優先度のより高い敵キャラクタC2を優先的に選択して復元対象とするため(ステップS62,S65,S68参照)、仮想カメラにより近くてプレイヤに注視されやすい敵キャラクタC2を優先して復元することができる。
更に、更新頻度低減対象であった全ての敵キャラクタC2の更新頻度を60回/秒にまで完全復元した後に、削除対象であった敵キャラクタC2を復元(再表示)することとしている(ステップS67参照)。換言すれば、負荷の増加量の小さい更新頻度を復元する処理を、負荷の増加量の大きい削除状態を解除する処理よりも優先して実行することとしている。これにより、復元処理によって制御部8の処理負荷が急激に増加するのを抑制している。即ち、仮に削除状態を解除する処理を優先して実行すると、ゲーム装置1の負荷が急激に増加するため、更新頻度低減対象である敵キャラクタC2の状態が復元されないまま、再び負荷が過大になって削除処理が実行され、敵キャラクタC2の状態の復元がなかなか進まない可能性がある。これに対し、本実施の形態では更新頻度を復元する処理を優先するため、このような事態を回避でき、より多くの敵キャラクタC2の動作を滑らかな(フレームレートの基準値と同程度の頻度で更新される)動画として表示させた後に、削除していた敵キャラクタC2を再表示させることができる。
また、図12のフローチャートから分かるように、15回/秒であった更新頻度を一度で60回/秒にまで復元することはせず、15回/秒から30回/秒に復元し(ステップS63)、次回以降のフレーム生成時の復元処理にて30回/秒から60回/秒に復元している(ステップS66)。これにより、上記と同様、1度の復元処理による負荷の急激な増大を抑制している。
以上に説明したように、本実施の形態に係るゲーム装置1は、フレーム40の生成に要する負荷が過大となった場合に、敵キャラクタC2を非表示にし、又は、敵キャラクタC2のオブジェクトデータの更新頻度を低減している。特に、モーション動作の更新頻度を低減することにより、プレイヤに違和感を生じさせるのを抑制しつつ、負荷の軽減を図ることができる。
なお、上述した説明では、負荷軽減処理の対象として敵キャラクタC2を採用した場合について言及したが、これに限られない。例えば、仮想ゲーム空間41を構成する水車や風に揺れる木などの動的オブジェクトであって、オブジェクトデータの更新頻度(モーション動作の更新頻度)を変更できるものであれば、更新頻度低減対象とすることができるし、また、削除処理の対象としてもよい。また、削除処理の対象としては、動的オブジェクトのみに限られず、例えば仮想ゲーム空間41を構成する建築物などの静的オブジェクトC3(図3参照)を対象としてもよい。
また、負荷が過大であるか否かを判定する際のフレームレートの閾値として、基準値が60fpsの場合に58fpsという数値を例示したが、これに限られず、例えば59fps又は57fps以下の数値でもよい。また、フレームレートの基準値が30fpsの場合には、28fpsを閾値として設定することができ、又は、適宜これとは異なる数値を設定することができる。
上記閾値に関しては、複数の値を設定することも可能である。例えば、58fps,55fps,50fpsという3つの閾値を設定してもよい。この場合の負荷軽減処理の例として、フレームレートの実測値が58fpsであった場合は、更新頻度が60[回/秒]の敵キャラクタC2を対象に、その更新頻度を30[回/秒]に低減する。また、実測値が55fpsであった場合は、更新頻度が30[回/秒]の敵キャラクタC2を対象に、それを15[回/秒]に低減する。また、実測値が50fpsであった場合は一部の敵キャラクタC2を削除処理する。この例ように、フレームレートの実測値が複数の閾値の何れより小さい値になるかに応じて、段階的に異なる内容の負荷軽減処理を実行するようにしてもよい。
また、更新頻度の低減の仕方について、本実施の形態では60[回/秒]から30[回/秒]、30[回/秒]から15[回/秒]というように、半分の値に2段階に分けて低減する態様を示したが、これに限られない。例えば、60[回/秒]から10[回/秒]まで、10[回/秒]単位で5段階に分けて低減するようにしてもよく、1度の低減単位や段階数は適宜設定することができる。
また、本ゲーム装置1では、フレームレートの測定値を算出するにあたり、オブジェクトデータの更新処理(モーション動作の更新処理)の開始時点から更新処理の終了時点までに要した時間を、CPU3のクロックを用いて計測することとしている。しかしながら、この算出方法に限られず、上記と異なる区間の処理に要する時間からフレームレートの測定値を算出してもよい。また、フレーム40の生成に要する負荷が過大であるか否かを判定することができる限り、フレームレートによらず他の指標を採用してもよい。
また、フレーム40内の敵キャラクタC2を、複数体ごとにまとめた複数のグループに分類し、負荷軽減処理や復元処理をグループ単位で実行するようにしてもよい。例えば、上述した説明では敵キャラクタC2は1体ごとに異なるソート優先度が設定されているが、削除対象である敵キャラクタC2(図5で言えばNPC26〜NPC30)を1つのグループとし、このグループに所属する敵キャラクタC2には互いに同一のソート優先度を設定する。同様に、更新頻度低減対象である敵キャラクタC2(図5で言えばNPC06〜NPC25)を別の1つのグループとし、このグループに所属する敵キャラクタC2にも互いに同一のソート優先度を設定する。これにより、削除対象の全ての敵キャラクタC2は、削除処理の実行によって全て同時に削除され、更新頻度低減対象である全ての敵キャラクタC2も、更新頻度低減処理の実行によって全て同時に更新頻度が低減される。復元処理においても同様である。なお、この場合において、例えば更新頻度低減対象の敵キャラクタC2を更に複数のグループに細分類し、このグループ毎に負荷軽減処理及び復元処理を実行するようにしてもよい。
また、ソート優先度の最も高いものから順に5体を、負荷軽減非対象の敵キャラクタC2とすることとしたが、6体以上に設定してもよいし、4体以下に設定してもよい。また、負荷軽減非対象の敵キャラクタC2を設定せず、全ての敵キャラクタC2を負荷軽減対象とするようにしてもよい。
削除対象についても、上述したようにソート優先度の順で26体目〜30体目の敵キャラクタC2とする態様、即ち、フレーム40内に含まれる敵キャラクタC2が25体になるまでは削除処理をするという態様に限定されない。例えばソート優先度の順で15体目〜30体目の敵キャラクタC2を削除対象としてもよいし、任意の数の敵キャラクタC2を削除対象として設定することができる。また、このように削除対象とする敵キャラクタC2のソート優先度を固定的に設定するのではなく、フレーム40内に含まれる敵キャラクタC2のうち、ソート優先度の低い所定数(例えば、5体)の敵キャラクタC2を削除対象とするようにしてもよい。
また、ソート優先度を決定する式(1)において、補正値A2を、仮想カメラからの距離に基づいて設定することとしているが、これに代えて、プレイヤキャラクタC1からの距離に基づいて設定するようにしてもよい。この場合、補正値A2は、プレイヤキャラクタC1からの距離が小さい敵キャラクタC2ほど大きな数値に設定すればよい。
また、本実施の形態では削除処理を行った後で更新頻度低減処理を実行することとしているが(図7参照)、更新頻度低減対象の全ての敵キャラクタC2について更新頻度低減処理を終えた後で、削除対象の敵キャラクタC2について削除処理を実行するようにしてもよい。また、所定数の敵キャラクタC2を削除処理した後に、残りの敵キャラクタC2について更新頻度低減処理を実行し、更にその後、所定数の敵キャラクタC2について削除処理を行うようにしてもよい。また、削除対象と更新頻度低減対象とを別々の敵キャラクタC2に設定しなくてもよく、更新頻度低減処理をした後に、更新頻度低減対象であった一部の敵キャラクタC2について削除処理を実行するようにしてもよい。更に、削除処理は行わず、更新頻度低減処理のみを行うようにしてもよい。