プロファイラーを使用して、まだ十分に高速に実行されていないコードを調べました。次の関数にほとんどの時間がかかり、この関数の時間の半分が に費やされたことがわかりましたfloor
。現在、この関数を最適化するか、1 レベル上に移動してこの関数の呼び出しを減らすという 2 つの可能性があります。最初のものが可能かどうか疑問に思います。
int Sph::gridIndex (Vector3 position) const {
int mx = ((int)floor(position.x / _gridIntervalSize) % _gridSize);
int my = ((int)floor(position.y / _gridIntervalSize) % _gridSize);
int mz = ((int)floor(position.z / _gridIntervalSize) % _gridSize);
if (mx < 0) {
mx += _gridSize;
}
if (my < 0) {
my += _gridSize;
}
if (mz < 0) {
mz += _gridSize;
}
int x = mx * _gridSize * _gridSize;
int y = my * _gridSize;
int z = mz * 1;
return x + y + z;
}
Vector3
3 つの float を格納し、いくつかのオーバーロードされた演算子を提供する単純なクラスです。_gridSize
型int
で_gridIntervalSize
あり、float
です。_gridSize ^ 3 個のバケットがあります。
この関数の目的は、ハッシュ テーブルのサポートを提供することです。すべての 3d ポイントはインデックスにマップされ、サイズ _gridIntervalSize ^ 3 の同じボクセルにあるポイントは同じバケットに着陸する必要があります。