Я выяснил, что при выполнении моей программы при замене векторов на массивы происходит упомянутое различие в производительности.
Вот соответствующие фрагменты кода:
Vec3f* dist_ori = new Vec3f [n_triangles];
Vec3f* s2_ori = new Vec3f [n_triangles];
// std::vector<Vec3f> dist_ori;
// std::vector<Vec3f> s2_ori;
for (int i=0; i<n_triangles; i++) {
dist_ori[i] = camera_origin - tri_arr[i].getVert1();
s2_ori[i].cross(dist_ori[i], tri_arr[i].getVert2_edge1());
}
for (int i=0; i<n_triangles; i++) {
dist_ori.push_back(camera_origin - triangle_container[i].getVert1());
Vec3f tmp;
tmp.cross(dist_ori[i], triangle_container[i].getVert2_edge1());
s2_ori.push_back(tmp);
}
Здесь начинаетсяважный код внутри двух основных циклов (остальное больше помогло прояснить, что это за код)
for (int i=0; i<n_triangles; i++) {
//if (triangle_container[i].intersect (camera_dir,camera_ori,dist_ori[i],s2_ori[i],triangle_container[i],t,u,v,x,y)) {
if (tri_arr[i].intersect (camera_dir,camera_ori,/*edge1[i],edge2[i],*/dist_ori[i],s2_ori[i],tri_arr[i],t,u,v,x,y))
object_index=i;
}
//Vec3f vert1 = triangle_container[object_index].getVert1 ();
//Vec3f vert2 = triangle_container[object_index].getVert2_edge1 () + vert1;
//Vec3f vert3 = triangle_container[object_index].getVert3_edge2() + vert1;
Vec3f vert1 = tri_arr[object_index].getVert1 ();
Vec3f vert2 = tri_arr[object_index].getVert2_edge1 () + vert1;
Vec3f vert3 = tri_arr[object_index].getVert3_edge2() + vert1;
Vec3f hit_normal = (1 - u - v) * vert1 + u * vert2 + v * vert3;
//mat_type = triangle_container[object_index].getMaterialId ();
mat_type = tri_arr [object_index].getMaterialId ();
//normal = triangle_container[object_index].getNormal (x,y);
normal = tri_arr [object_index].getNormal (x,y);
for (int j=0; j<n_triangles; j++) {
//if (triangle_container[j].generateShadows (light_ray_dir,intersection,/*edge1[j],edge2[j],*/triangle_container[j],t,x,y)) {
if (tri_arr[j].generateShadows (light_ray_dir,intersection,/*edge1[j],edge2[j],*/tri_arr[j],t,x,y)) {
in_shadow = true;
break;
}
}
Во всяком случае, я тестировал оба кода в двух разных тестовых случаях, где я видел почти. Честно говоря, я вполне удовлетворен решением для работы с массивами, тем более что я уже написал код для него, тем не менее, для дальнейших случаев было бы неплохо узнать, есть ли способ предотвратить это. Плюс мне любопытно узнать причину. Из других тем здесь и в других местах, кажется, что дополнительный код вектора может быть причиной сброса денежных средств, но хотелось бы проверить его более подробно
Используемые флаги компилятора: -O2, -fexорого-оптимизации,--fast-math и -march = native с g ++