優先度スコア

primary-score.png

定義

メインメモリやテクスチャメモリに保持されるブロックの重要度のこと。
簡易的にLRU(least recently used) 使われてから最も長い時間が経った要らないっぽいものを捨てる、アルゴリズムを実現する。
使われてから最も長い時間が経った要らないっぽいものに、新しくロードしたいデータを上書きするってこと。
最近使われていないデータ領域には低い優先度スコアが割り当て、
最近使われたデータ領域には高い優先度スコアを割り当てる。

低い優先度スコア
何フレームも前の昔に転送した古いデータ
高い優先度スコア
最近のカメラ位置において頻繁に描画されてる

優先度スコアのフォーマット

変数名は ULONGLONG needflag[ULONGLONGSIZE]; てかんじ。

  • 全部で64bit
  • 1フレームにつき5bit使う。void File::countMainLRU(void)で行う。

ソースコード上

ULONGLONG needflag;などという名前で書いてある。
unsigned long longに直してやろうかな。、、
File.hクラスに存在している。

64 ビット型配列で表現される巨大な数の最小値を見つける

本項では3.2.2 項の優先度スコアの長寿化で説明した、64 ビット型× N 桁配
列で表現される優先度スコアM個の中から最小値を見つけるソースコードにつ
いて説明する。最小値をみつけるには、まず0 でない桁がどこにあるかを探索
する。図A.10 はM=4、N=3 の場合の模式図である。横1列が一つの64 ビット
× N 桁配列の優先度スコアであるとする。図A.11 の7 行目のmincontent は0
番目からM-1 番目の数字をたどる際に、現時点における最小値を記録しておく
ための変数である。図A.11 の5 行目のminIndex は現時点における最小値のイ
ンデックスを記録しておくための変数である。0 でない桁が小さい位に近いほ
ど、その値は小さい値である。一つ一つの数字はN 64 ビットで表現される
巨大な数となる。0 からM-1 までたどっていき、現在見つけた0 でない桁のう
ち、0 以外の64 ビットデータが表れる最も遅いインデックスをj0 とする。初期
値としては図A.11 の4 行目のように一番大きい値を格納するN-1 とする。各ス
コアは大きな値を格納するN-1 から順に走査して0 でない最初のインデックス
を探して変数j に入れる(図A.3 の11~15 行目)例えば、図A.10 のi=0 番目の
j は1 になり、i=1 番目のj は2 になる。i=2 番目のj も2 である。また、もしす
べて0 である場合は、そのスコアは最小値の0 となるので、最小スコアのイン
デックスとしてi を返す(図A.3 の16~18 行目)ループを抜けたら、このj の
値が、j0 の値を比べて小さいかどうかを判定する(図A.3 の22 行目)現在のj
の方が小さい値であったら、優先度スコアi は最小値となるので更新する(図
A.3 の21~24 行目、27 行目)。同時に、j0 の値も最新のものに更新する(図A.3の26 行目)。
もし、j0 が比較対象のj と同じ値なら、j0 に位置する実際の値を比較する(図
A.3 の29 行目)。比較して低い値を持つ方が最小の優先度スコアとなる。また、
もしj0 の位置にある値を比較した結果、同じ値であったら、j0 以下の値を次々
と比較して大小関係を定めなければならない(図A.3 の35 行目)85 ページの図
でいうと、i=0 番目とi=4 番目の優先度スコアはともに0 でない桁が1 桁目であ
る。その1 桁目に全く同じ64 ビット型の数値が入っている。0 桁目まで大小関
84
係を比較してはじめてi=0 番目よりもi=4 番目の方が小さい数字であるという
ことが判明する。正しい大小関係を調べるには、必要なときに桁を掘り下げて
調べる必要がある。0~M-1 までたどった結果最も小さかったものがminIndex
に保持され、それを返り値として返す(図A.3 の49 行目)。

サポートサイト Wikidot.com