Maps > ロード・オン・デマンドの使用 > 新しいキャッシュ・アルゴリズムを記述する
 
新しいキャッシュ・アルゴリズムを記述する
このセクションでは、アプリケーション特有の要件を満たすようにカスタマイズされた、キャッシュ・アルゴリズムを記述する方法について説明します。このセクションの例は、Rogue Wave® Views Maps ライブラリーに用意されているクラス IlvDefaultTileCache の簡易版です。この例のソース・コード一式は、以下のファイルにあります。
クラス SimpleTileCache は、クラス IlvTileCache を拡張します。
 
class TileCache
:public IlvTileCache
{
public:
TileCache(int size);
TileCache::TileCache(IlvInputFile& file);
virtual void tileAboutToLoad(IlvTile *);
virtual void tileCached(IlvTile *);
virtual void tileRetrieved(class IlvTile *);
virtual void controllerDeleted(IlvTileController *);
virtual void write(IlvOutputFile& output) const;
private:
int _size;
IlList _tiles;
};
 
_size では、キャッシュに格納可能なタイルの最大数を定義します。
 
TileCache::TileCache(int size)
:IlvTileCache(),
_size(size)
{
}
 
TileCache コンストラクターでは、特定のサイズでデフォルト・キャッシュのインスタンスを作成します。
以下のコンストラクターでは、提供された入力ストリームからキャッシュを読み込みます。このコンストラクターを使って作成したキャッシュには永続性があるため、IlvTiledLayer オブジェクトに保存されます。
 
TileCache::TileCache(IlvInputFile& file)
:IlvTileCache()
{
file.getStream() >> _size;
}
 
write メソッドでは、出力ストリームのキャッシュを書き込みます。
 
void
TileCache::write(IlvOutputFile& output) const
{
output.getStream() << _size;
}
 
以下のメソッドは、IlvTileCache インターフェースに属します。このメソッドは、タイルのキャッシュ時に呼び出されます。この実装では、タイルは内部タイル・リストの末尾に追加されます。
 
void
TileCache::tileCached(IlvTile *tile)
{
_tiles.append(tile);
}
 
以下のメソッドは、IlvTileCache インターフェースに属します。このメソッドは、タイルをキャッシュから削除し、再びロックすると呼び出されます。この実装では、タイルは内部タイル・リストから削除されます。
 
void
TileCache::tileRetrieved(IlvTile* tile)
{
_tiles.remove(tile);
}
 
以下のメソッドは、IlvTileCache 抽象クラスに属します。このメソッドは、タイルのロード直前に呼び出されます。この実装では、キャッシュのタイル数がキャッシュ・サイズを超えた場合に、内部タイル・リストの先頭にある LRU タイルがアンロードされ、新規タイルの領域を確保します。
 
void
TileCache::tileAboutToLoad(IlvTile *tile)
{
int toRemove = _tiles.length() - _size;
if (toRemove <= 0)
return;
for (int i = toRemove; i > 0; i--) {
IlvTile* current = (IlvTile*)_tiles[0];
_tiles.remove(current);
releaseTile(current);
}
}
 
以下のメソッドは、IlvTileCache 抽象クラスに属します。このメソッドは、タイル・レイヤーをマネージャーから取り出し、タイル・コントローラが管理するタイルをキャッシュから削除すると呼び出されます。
 
void
TileCache::controllerDeleted(IlvTileController* controller)
{
IlvLink* l;
l = _tiles.getFirst();
IlvTile* tile;
while (l) {
tile = (IlvTile*) l->getValue();
l = l->getNext();
if (tile->getController() == controller)
_tiles.remove(tile);
}
}
 

Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.