テクスチャを描画するときデータはVRAMに転送して使用しますが、VRAMの容量には限りがあります。アプリの規模がある程度大きくなり、一度に全てのテクスチャをVRAMに乗せられなくなると、場面によってVRAM上のテクスチャデータを入れ替える必要が出てきます。
場面がはっきりと分かれていて、一つ一つの場面で使用するテクスチャが十分小さい場合は自前でテクスチャを入れ替えても良いのですが、なかなかそうもいかなかったり、面倒だったりするのでテクスチャキャッシュという機構を使ってシステムにやらせてみます。
※"テクスチャキャッシュ"というと、VRAM上でキャッシュに乗せてGPUが高速にアクセス…みたいな話だったりしますが、ここではVRAMに乗せるテクスチャ自体をキャッシュするということになります。
テクスチャキャッシュ概要
・テクスチャが必要なとき(描画時)、キャッシュにそのテクスチャがあるか検索する。
・キャッシュにあった場合、すでにVRAMに読み込まれているのでそれを使用する。また、キャッシュ上での優先度を上げる。
・キャッシュに無かった場合、テクスチャをVRAMに読み込み、優先度を上げてキャッシュに登録する。このとき、登録されているテクスチャの総容量(枚数、またはサイズ)がキャッシュの容量を超えていた場合、優先度の低いテクスチャをVRAMとキャッシュから削除する。
Texture.h
/**************************
テクスチャキャッシュ
**************************/
class TexCache : public Texture
{
static TexCache** cache; // キャッシュ
static int cache_num; // キャッシュ数
static u32 cache_mem_size; // キャッシュ使用メモリサイズ
static void clear_cache(void); // 最後尾のテクスチャを削除
public :
// リソース種類
enum
{
RES_MEMORY = 0, // メモリ
RES_ASSET, // assetsファイル
};
static void init(void); // 初期化
static void quit(void); // 削除
static Texture* get_texture(short, const void*); // テクスチャ取得
short type; // リソース種類
const void* data; // リソースデータ
u32 mem_size; // VRAM占有サイズ
TexCache(short, const void*); // コンストラクタ
};
Texture.cpp
セコメントをする