2016-11-30 25 views
1

raytracerの特定のアスペクトについて、あらかじめ計算された値を持つルックアップテーブルとして使用する、x、y座標ごとの2Dポイントのベクトルを保存します。このためマップデータ構造のマップを最適化する

、私は次のタイプのデータ構造を作成:データ構造の複雑さのアイデアを与えるために

std::map<float, std::map<float, std::vector<vec2>>> apertureMap; 

を、地図、ベクトルは、それぞれ32個のエントリを保持します。

私はxの下限値を見つけることができ、yはにより座標:

// find lowest bound x value 
std::map<float, std::map<float, std::vector<vec2>>>::iterator it; 
it = apertureMap.lower_bound(someInputValueX); 
float value1 = it->first; 

// find lowest bound y value 
std::map<float, std::vector<vec2>>::iterator it2; 
std::map<float, std::vector<vec2>> internal_map = it->second; 
it2 = internal_map.lower_bound(someInputValueY); 
float value2 = it2->first; 

vec2 vertex = {it2->second[randomNumber].x, it2->second[randomNumber].y}; 

このすべてが期待通りに動作しますが、驚くほど遅いです。私はこれらの2つの値をレイごとに1回だけ呼び出す必要があります。これは、次のレイが破壊され、このすべてを再度作成することを意味します。

どのようにこのプロセスをスピードアップするための推奨事項?私は初心者のために順序付けられていないマップを使いたいと思いますが、正確ではないキーを見つける必要があります。これは下限/上限を使ってしかできないと思いますか?より速い方法があれば、私はこの特定のデータ構造に結びついていません。

+2

'std :: map > internal_map = it-> secondはマップをコピーします。それを参照してください。 – Arunmu

+1

あなたが実際に注文する必要がないかぎり、 'unordered_map'を使用してください。代わりに' 'の' make_heap'関数を使うことも考えてください。 – Mgetz

答えて

3

このライン:

std::map<float, std::vector<vec2>> internal_map = it->second; 

それは内部のマップの完全なコピーを作成します。 internal_mapit->secondへの参照に変更するか、その行を完全に削除して、it->secondを直接使用するように次の行を変更します。

+0

素晴らしいです。 1200%のスピードアップ。どうもありがとう。 –

関連する問題