El sacrificio de Frustum lleva años c ++

Tengo dos maneras de realizar la eliminación de trunco ​​de fonts web diferentes. El primero toma 200ms para verificar 10k AABB, el segundo alnetworkingedor de 50ms para el mismo conteo de cajas. Leí algunas respuestas al foro, la gente dice 0.5ms por 10k está bien, pero estoy totalmente lejos de esos numbers. Entonces, ¿qué estoy haciendo mal?

Midiendo el time aquí:

auto frustum = camera.getFrustum(); //frustum auto n = frustum.pNear; auto f = frustum.pFar; auto e = frustum.pExtra; ArrayList<Pair<vec3, vec3>> planes; ArrayList<vec3> v1; n.genVertices(v1); ArrayList<vec3> v2; f.genVertices(v2); planes << Pair<vec3,vec3>(v1[0], -n.genNormal()); planes << Pair<vec3,vec3>(v2[0], n.genNormal()); for(size_t i = 0; i < 4; i++) { planes << e[i]; } //frustum planes array initialization done ArrayList<AABB> objs; //10k test aabbs for(size_t i = 0; i < 10000; i++) { objs << AABB(vec3(rand_float()/100,rand_float()/100,rand_float()/100),rand_float()/100); } auto t1 = timer.getTimeNanoSeconds(); //starting to measure for(size_t i = 0; i < 10000; i++) { rs::CollisionEngine::checkAABBAndFrustumFast(objs[i], planes); } auto t2 = timer.getTimeNanoSeconds() - t1; //getting time println("Collision check of 10k objs: "+ toString(t2/1000000) + " ms"); //printing time 

Aquí hay controles de colisión lentos y rápidos:

  /** * * @param box * @return 0 - inside, 1 - intersects, 2 - outside */ us checkAABBAndFrustumSlow(AABB box, ArrayList<Pair<vec3, vec3>>& planes) { ArrayList<vec3> vertices; box.genVertices(vertices); us totalIn = 0; for(int i = 0;i<6;i++){ //six planes for every frustum Pair<vec3, vec3> plane = planes[i]; auto n = plane.v2; uint inCount = 8; uint pIn = 1; for(int j= 0;j<8;j++){ vec3 v = vertices[j]; vec3 toVertex = (v - plane.v1).normalize(); float res = n * toVertex; if(res < 0){ inCount -=1; pIn = 0; } } if(inCount == 0) return 2; totalIn += pIn; } if(totalIn == 6) return 0; return 1; } using namespace rs; vec3 getPosForFrustum(AABB b, vec3 n) { vec3 max = b.center + b.extent; vec3 p = b.center - b.extent; if (nx() >= 0) p(1) = max.x(); if (ny() >=0) p(2) = max.y(); if (nz() >= 0) p(3) = max.z(); return p; } vec3 getNegForFrustum(AABB b, vec3 n) { vec3 min = b.center - b.extent; vec3 p = b.center + b.extent; if (nx() >= 0) p(1) = min.x(); if (ny() >=0) p(2) = min.y(); if (nz() >= 0) p(3) = min.z(); return p; } uint checkAABBAndFrustumFast(AABB box, ArrayList<Pair<vec3, vec3>>& planes){ uint result = 0; for(int i = 0;i<6;i++) { auto n = planes[i].v2; auto p = planes[i].v1; if (n * (getPosForFrustum(box, n) - p) < 0) return 2; else if (n * (getNegForFrustum(box, n) - p) < 0) result = 1; } return result; } 

EDITAR: ArrayList es una estructura tipo vector personalizado

Pair contiene una copy de dos objects que toma.

Formas principales para acelerar la eliminación de triturado de troncos (y colisión en general):

  • Límite simplificado : tiene AABB (verificar)
  • funciones rápidas de colisión : parece que estás haciendo esto (en progreso)
  • objects de particionamiento espacial en el mundo : ???

La partición espacial da la mayor velocidad. ¿Estás haciendo algo? Dependiendo del tipo de juego, hay una gran cantidad de maneras fáciles de boost el performance masivo a: eliminación de triturado de troncos, colisión, selección, IA, etc. todo usando la misma partición mundial.