ゲーム制作講座5

5.高速グラフィック描画
(ディスクアクセスとメモリアクセス)



 今回は今までのグラフィック描画速度を何倍も高速にする方法を解説したいと思います。

 突然ですがディスクアクセス(ファイルをセーブしたりロードしたりする作業)メモリアクセス(ロードしたファイル
データなどを参照したり書き換えたりする作業)
はどちらが速いでしょうか?

 …いうまでもなくメモリアクセスです。あまりにも当たり前なので特に説明はしません。

 そして今まで絵を表示するために使ってきた LoadGraphScreen 関数はグラフィックのデータをその都度
ディスク上のファイルから読みこんでいます。そうですディスクアクセスです。つまりとてつもなく今までの処理形態は
遅いのです。

 普通ゲームなどに限らず多用するグラフィックや音のデータパソコンのメモリ上にあらかじめロードしておき、
メモリアクセスで高速に画面に絵を描画したり瞬時に音を鳴らしたりします。

 特にゲームでは高速なグラフィックの描画を行わなければならないので、メモリへグラフィックデータを読み
込むと言う方法は必要不可欠です。そんな重要なメモリへのロードですが、DXライブラリは LoadGraph という
関数を使うことでそれを実現する事が出来ます。

 では早速ですがメモリへグラフィックデータをロードする機能を使って、画面左上に『test1.bmp』という
画像ファイルを表示するというだけのプログラムを見てみてください。
#include "DxLib.h" // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GraphHandle ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // グラフィック『test1.bmp』をメモリにロード GraphHandle = LoadGraph( "test1.bmp" ) ; // 0,0 座標にメモリに読みこんだグラフィックを描画 DrawGraph( 0 , 0 , GraphHandle , FALSE ) ; // キー入力を待つ WaitKey() ; // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }
 上記のプログラムを LoadGraphScreen を使った場合は以下の示すプログラムになります。
#include "DxLib.h" // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // 0,0 座標にグラフィック『test1.bmp』を描画 LoadGraphScreen( 0 , 0 , "test1.bmp" , FALSE ) ; // キー入力を待つ WaitKey() ; // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }
<実行例>

 さてメモリにグラフィックデータをロードする LoadGraph 関数は引数としてファイル名を取り、戻り値に int 型の、
メモリに保存したグラフィックデータの識別番号を返します。この識別番号ロードしたグラフィックを描画したり
メモリ上からグラフィックデータを削除したりする場合に必要
となりますので必ず変数に保存しておく必要があります。
(上記のプログラムでは GraphHandle という変数に保存しています)
 なおグラフィックデータの識別番号の事をグラフィックデータを間接的に示している番号である事から『グラフィック
ハンドル』
とDXライブラリの関数リファレンスでは呼んでいますので注意してください。

 そしてメモリにロードしたグラフィックデータを使って画像を描画する場合は、LoadGraphScreen とは別に、ロードした
グラフィックデータを画面に描画する専用の DrawGraph 関数を使う必要があります。この関数は LoadGraphScreen と違い、
LoadGraphScreenグラフィックファイル名を入れていた引数部に LoadGraph 関数を使ってグラフィックをロードした時
に戻ってきたグラフィックデータの識別番号
を指定してやる必要があります。違いはそれだけです。上記のサンプルでは
LoadGraph 関数使用時に識別番号を保存した GraphHandle という変数をここに入れています。

 今回はこれで終りです。これだけで描画速度が100~200倍になります。(^^
 短かったですがこれからはグラフィックの識別番号(グラフィックハンドル)を使ってグラフィックを描画しますので
この事はよく理解しておいてください。

 さて次は基礎部分から少し抜けてシューティングゲームらしくなって行きます。
 そうですシューティングです。最初はシューティングから作れるようになりましょう!

戻る