弾を撃つたびにゲームが一瞬止まってしまう。
ハードディスクにアクセスする「ロード」という処理は時間がかかることが分かっただろう。
これを回避するために、1度ロードした情報(Fbxクラスのインスタンス)を使いまわすようにしよう。
デザインパターン(プログラムの書き方)の中にフライウェイトという手法がある。
今回のやり方は厳密にはデザインパターンのそれとは違うが考え方は同じ。
本来のやり方は今後の「プログラムデザイン」の科目で学習してほしい。
弾が3発出ているとする。
3発とも見た目は同じなので、Fbxオブジェクトは1つだけ作ってそのアドレスを持っていればいい。
位置を含むTransformは弾ごとに異なるので、Transformオブジェクトはそれぞれが持っていなければならない。
あとは既に同じファイルが使われているかどうかを調べるためにファイル名も持たせよう。
ということで「Fbx型のポインタ」「Transform型の変数」「ファイル名を入れる変数」をまとめた構造体を作り、それを動的配列にする。
「すでに同じものがロードされてたら使いまわす」という部分はいったん置いておいて、とりあえず全部ロードする形で書いていく。
ロード関数の処理は以下の通り。
構造体のインスタンスを作成。
そのメンバのファイル名に引数の内容を代入
Fbxオブジェクトを作成し、ロードする
構造体の中身が埋まったので動的配列に突っ込む
番号(配列の要素数-1)を返す
他の2つの関数の中身は難しくないので書いてしまおう。
そうすれば、Bulletクラスで3Dモデルを表示する方法が昨年のゲームエンジンと同じ書き方でいけるので試してみる。
まだ弾を撃つごとに処理落ちするが、問題なく表示されればOK。
では本題の「データを使いまわしてロード時間を減らす」仕組みを作っていく。
上記ロード処理の説明の「3.Fbxオブジェクトを作成し、ロードする」の部分を修正する。
ループで配列の中のファイル名をしらべ、今開こうとしてるものと同じものがあれば、そのFbxオブジェクトのアドレスを使用する。
同じ名前のファイルが無ければ、今まで通りFbxオブジェクトを作成し、ロードすればいい。
これで、初回のみ処理落ちするが2回目以降はスムーズに動くようになる。
ゲーム終了時やシーン切り替え時に、ロードしたファイルをすべて開放しなければならない。
それ用の関数を作っておこう。
がんばれ