Я работаю над трассировкой лучей с обратным почтовым ящиком, что означает, что для каждого луча я помню последние 8 идентификаторов треугольников, которые я пересек. Если треугольник идентификатора находится в почтовом ящике, и если я снова получу тот же идентификатор, больше вычислений пересечения не делается. Это уменьшает количество вычислений пересечений, но время вычислений хуже.
Есть часть моего кода … Есть идеи, чтобы ускорить это? Я пробовал массив, список, вектор …
// Class representing a ray: oriented halfline
struct Ray{
public:
// origin of the ray
Vector3 origin;
// normalized direction
Vector3 direction;
// computed intersection point along the ray
float t;
// intersected triangle
Triangle *triangle;
//list <int> mailbox;
int *mailbox;
//set<int> mailbox;
int intersections;
.
.
.
.virtual void traverse(Ray &ray){
for (vector<Triangle*>::size_type i=0; i<T.size(); i++){
if(find(ray.mailbox, ray.mailbox + 8, T[i]->id) == ray.mailbox + 8){
//if(ray.mailbox.find(T[i]->id) == ray.mailbox.end()){
T[i]->CastRay(ray);
//ray.mailbox.insert(ray.mailbox.begin() + (T[i]->id % 8));
ray.mailbox[(T[i]->id % 8)] = T[i]->id;
//ray.mailbox.pop_front();
//ray.mailbox.push_back(T[i]->id);
//assert(ray.mailbox.size() == 8);
}
}
}
Задача ещё не решена.
Других решений пока нет …