テクスチャ キャッシングのために、3D レンダラーに LRU アルゴリズムを実装する必要があります。Linux の C++ でコードを記述します。
私の場合、テクスチャ キャッシングを使用して、画像データの「タイル」(16x16 ピクセル ブロック) を格納します。ここで、キャッシュ内でルックアップを行い、ヒットを取得したとします (タイルはキャッシュ内にあります)。そのエントリの「キャッシュ」の内容を関数の呼び出し元に返すにはどうすればよいですか? 私は説明する。タイルをキャッシュ メモリにロードするときに、たとえば 16x16 ピクセルを格納するためにメモリを割り当ててから、そのタイルの画像データをロードすることを想像します。キャッシュ エントリの内容を関数の呼び出し元に渡す方法は 2 つあります
。1) タイル データへのポインタとして (高速でメモリ効率が高い)TileData *tileData = cache->lookup(tileId); // 安全ではありません?
2) または、関数の呼び出し元によって割り当てられたメモリ空間内のキャッシュからタイル データを再コピーする必要があります (コピーが遅くなる可能性があります)。
void Cache::lookup(int tileId, float *&tileData) { // キャッシュ内のタイルを見つけます。ディスクからのキャッシュ ロードでない場合は、キャッシュに追加します ... ... // タイル データをコピーします。安全ですが、それほど遅くはありませんか? memcpy((char*)tileData, tileDataFromCache, sizeof(float) * 3 * 16 * 16); } float *tileData = new float[3 * 16 * 16]; // そのタイルにメモリを割り当てる必要があります // キャッシュからタイル データを取得します。コピーが必要です cache->lookup(tileId, tileData);
私は 1) を使用しますが、問題は、ルックアップの直後にタイルがキャッシュから削除され、関数がリターン ポインターを使用してデータにアクセスしようとするとどうなるかということです。これに対する唯一の解決策は、参照カウント (auto_ptr) の形式を使用することです。データは、使用されなくなったときにのみ実際に削除されますか?
アプリケーションは複数のテクスチャにアクセスする場合があります。各テクスチャとテクスチャの各タイルに固有のキーを作成する方法が見つからないようです。たとえば、ファイル 1 のタイル 1 とファイル 2 のタイル 1 がキャッシュにある場合、tildId=1 で検索するだけでは十分ではありません...しかし、ファイルを説明するキーを作成する方法が見つからないようです。名前と tileID。ファイル名と tileID (FILENAME_TILEID) を含む文字列を作成できますが、キーとして使用される文字列は整数よりもはるかに遅くなりませんか?
最後に、タイムスタンプについて質問があります。多くの論文では、キャッシュ内のエントリの順序付けにタイム スタンプを使用することを提案しています。タイムスタンプを使用するのに適した関数は何ですか? time() 関数、clock()? タイムスタンプを使用するよりも良い方法はありますか?
申し訳ありませんが、非常に長いメッセージであることは承知していますが、LRU の実装は思ったほど簡単ではないようです。