テクスチャキャッシュ
2013-11-10


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]-&gtdata) && (_type == cache[i]-&gttype) ) { // 登録済み 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]-&gtmem_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]-&gtmem_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行目から)、はじめにキャッシュ上の総数がオーバーしていたときは優先度最低の一枚を削除します。

続きを読む
戻る
[Android プログラミング]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット