C++/DxLibで大量の画像を管理する方法
Posted: 2013年9月29日(日) 17:09
はじめまして。C++/DXライブラリを使用してゲームを作成しています。
作成中に画像ハンドルの管理方法に疑問を感じたので質問します。
今回はあらゆる画像情報(ハンドルなど)をvectorに格納しているのですが、表示の際に
目的の画像を見つけ出すために毎回vectorの先頭から検索する必要が出てきてしまっています。
ゲーム中には、いろいろな種類の画像が出てきます。(背景、キャラクター、メッセージ枠など)
そこで、画像を管理するために以下のようなクラスを作りました。
基底クラスGraphicおよびこれを継承した背景・キャラクタークラスを作成しました。
また、画像情報をvector型で持つ画像管理クラス(GraphicManager)を作成しました。(例のため簡略化しています)
画像を読み込む際には、以下のように使用します。
このように実装すると、画像を全て一つのvectorで管理できるので便利ですが、表示の際が面倒です。
例えばvectorに画像が100枚格納されているとき、id=100のキャラクター画像とid=200の背景画像を表示する、とします。
その際、vector内をループで回して
graphic_type == type_character && character_id == 100 のもの、および
graphic_type == type_background && character_id == 200 のものを毎フレームごとに検索する必要があります。
この例では2種類の画像を検索するので、最大200回ループすることになります。
PCの処理は早いとはいえ、このように何百回もループするような処理が積み重なり処理が重くなる可能性があるのでは、と考えています。
一般的には、どのようにして大量の画像を管理をし、表示の際にはどのように目的の画像を探しだすものなのでしょうか。
これに比べ良い方法があるのか、それともvectorだから検索は早いので、探し出す時間は無視しても良いのでしょうか。
作成中に画像ハンドルの管理方法に疑問を感じたので質問します。
今回はあらゆる画像情報(ハンドルなど)をvectorに格納しているのですが、表示の際に
目的の画像を見つけ出すために毎回vectorの先頭から検索する必要が出てきてしまっています。
ゲーム中には、いろいろな種類の画像が出てきます。(背景、キャラクター、メッセージ枠など)
そこで、画像を管理するために以下のようなクラスを作りました。
基底クラスGraphicおよびこれを継承した背景・キャラクタークラスを作成しました。
また、画像情報をvector型で持つ画像管理クラス(GraphicManager)を作成しました。(例のため簡略化しています)
//画像の基底クラス
class Graphic{
public:
//画像の種類:背景、キャラクター、その他
enum GraphicType{
type_background,
type_character,
type_other
}
Graphic();
int handle;//グラフィックハンドル
int graphic_type;//画像の種類(enum GraphicTypeのどれかが入る)
};
//背景画像クラス
class BackGroundGraphic : public Graphic{
public:
//コンストラクタ内で 引数typeを元にgraphic_type、idを元にbackground_idを設定します。
//またDxLib::LoadGraph(filename)を行い、グラフィックハンドルhandleを設定します。
BackGroundGraphic(int id, int type, char *filename);
//背景画像固有の変数
int background_id;
};
//キャラクター画像クラス
class CharacterGraphic : public Graphic{
public:
//コンストラクタ内で 引数typeを元にgraphic_type、idを元にcharacter_idを設定します。
//またDxLib::LoadGraph(filename)を行い、グラフィックハンドルhandleを設定します。
CharacterGraphic(int id, int type, char *filename);
//キャラクター画像固有の変数
int character_id;
bool visible;
};
//画像管理クラス
class GraphicManager{
public:
GraphicManager();
std::vector<Graphic> vec;
}
GraphicManager g_manager;
//vecにキャラクター画像を挿入
g_manager.vec.push_back( CharacterGraphic( 100, type_character, "image1.png" ) );
g_manager.vec.push_back( CharacterGraphic( 101, type_character, "image2.png" ) );
//vecに背景画像を挿入
g_manager.vec.push_back( BackGroundGraphic( 200, type_background, "back.png" ) );
例えばvectorに画像が100枚格納されているとき、id=100のキャラクター画像とid=200の背景画像を表示する、とします。
その際、vector内をループで回して
graphic_type == type_character && character_id == 100 のもの、および
graphic_type == type_background && character_id == 200 のものを毎フレームごとに検索する必要があります。
この例では2種類の画像を検索するので、最大200回ループすることになります。
PCの処理は早いとはいえ、このように何百回もループするような処理が積み重なり処理が重くなる可能性があるのでは、と考えています。
一般的には、どのようにして大量の画像を管理をし、表示の際にはどのように目的の画像を探しだすものなのでしょうか。
これに比べ良い方法があるのか、それともvectorだから検索は早いので、探し出す時間は無視しても良いのでしょうか。