TexCache** TexCache::cache; // キャッシュ
int TexCache::cache_num; // キャッシュ数
u32 TexCache::cache_mem_size; // キャッシュ使用メモリサイズ
/**********************
キャッシュ初期化
**********************/
void TexCache::init(void)
{
cache = new TexCache *[TEX_CACHE_NUM]; // キャッシュ作成
cache_num = 0;
cache_mem_size = 0;
}
/********************
キャッシュ削除
********************/
void TexCache::quit(void)
{
for (int i = 0; i < cache_num; i++) { // テクスチャ削除
delete cache[i];
}
delete[] cache;
}
/****************************************
テクスチャ取得
引数 _type = リソース種類
_data = リソースデータ
****************************************/
Texture* TexCache::get_texture(short _type, const void* _data)
{
int i, j;
for (i = 0; i < cache_num; i++) {
if ( (_data == cache[i]->data) && (_type == cache[i]->type) ) { // 登録済み
if ( i > 0 ) {
TexCache* _tmp = cache[i];
for (j = i; j > 0; j--) {
cache[j] = cache[j - 1];
}
cache[0] = _tmp; // 先頭に登録
}
return (Texture*)cache[0];
}
}
// 新規登録
if ( cache_num == TEX_CACHE_NUM ) { // 枚数オーバー
clear_cache();
}
j = cache_num/2;
for (i = cache_num; i > j; i--) {
cache[i] = cache[i - 1];
}
cache[j] = new TexCache(_type, _data); // リソース読み込み
cache_num++;
cache_mem_size += cache[j]->mem_size;
while ( cache_mem_size > TEX_CACHE_MEM ) { // メモリサイズオーバー
clear_cache();
}
return (Texture*)cache[j];
}
/******************************
最後尾のテクスチャを削除
******************************/
void TexCache::clear_cache(void)
{
cache_num--;
cache_mem_size -= cache[cache_num]->mem_size;
delete cache[cache_num]; // テクスチャ削除
}
/****************************************
リソース読み込み
引数 _type = リソース種類
_data = リソースデータ
****************************************/
TexCache::TexCache(short _type, const void* _data)
{
type = _type; // リソース種類
data = _data; // リソースデータ
switch ( _type ) {
case RES_MEMORY : // メモリ
load_png((const u8*)_data);
break;
case RES_ASSET : // assetsファイル
{
u8* _p = (u8*)load_asset((const char*)_data);
load_png(_p);
free(_p);
}
break;
default :
assert(FALSE);
break;
}
switch ( format ) { // VRAM占有サイズ計算
case FORMAT_RGBA :
mem_size = width*height*4;
break;
case FORMAT_RGB :
mem_size = width*height*3;
break;
}
}
・テクスチャ取得
テクスチャリソースの指定は、メモリ(アドレス指定)または assetsのファイル(ファイル名指定)で行います。
まず同じリソースのテクスチャをキャッシュから検索します。このとき処理速度のことを考えて、ファイルの一致はファイル名文字列の中身の比較ではなく、アドレスを比較することにしています。
キャッシュから見つかった場合(179行目から)、優先度を上げて(他のテクスチャの優先度を下げて、先頭に登録する)そのテクスチャを返します。
見つからなかった場合(191行目から)、はじめにキャッシュ上の総数がオーバーしていたときは優先度最低の一枚を削除します。
セコメントをする