Couple of small optimisation

Add option to build for gprof
Do not build by default with the renderstat (they have a reasonable impact on performances)
Separated created ray and castedray in the stats
Trying to force some simple function to be inlined
This commit is contained in:
Godzil
2020-03-13 18:22:35 +00:00
parent aacd4f6c9e
commit 9849c16f66
8 changed files with 32 additions and 20 deletions

View File

@@ -12,11 +12,17 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/external/covera
option(PACKAGE_TESTS "Build the tests" ON) option(PACKAGE_TESTS "Build the tests" ON)
option(ENABLE_COVERAGE "Build for code coverage" OFF) option(ENABLE_COVERAGE "Build for code coverage" OFF)
option(SHOW_STATS "Show rendering stat" ON) option(SHOW_STATS "Show rendering stat" OFF)
if (SHOW_STATS) if (SHOW_STATS)
add_compile_options(-DRENDER_STATS) add_compile_options(-DRENDER_STATS)
endif() endif()
option(USE_GPROF "Enable profiling" OFF)
if (USE_GPROF)
add_compile_options(-pg)
add_link_options(-pg)
endif()
option(USE_LUA "Enable the use of Lua" ON) option(USE_LUA "Enable the use of Lua" ON)
if (USE_LUA) if (USE_LUA)
add_compile_options(-DENABLE_LUA_SUPPORT) add_compile_options(-DENABLE_LUA_SUPPORT)

View File

@@ -54,6 +54,7 @@ Ray Camera::rayForPixel(uint32_t pixelX, uint32_t pixelY)
Tuple origin = this->inverseTransform * Point(0, 0, 0); Tuple origin = this->inverseTransform * Point(0, 0, 0);
Tuple direction = (pixel - origin).normalise(); Tuple direction = (pixel - origin).normalise();
stats.addCastedRay();
return Ray(origin, direction); return Ray(origin, direction);
} }

View File

@@ -27,7 +27,8 @@ private:
uint64_t csgCount; /* Total number of CSG */ uint64_t csgCount; /* Total number of CSG */
uint64_t pixelCount; /* Total number of rendered pixels */ uint64_t pixelCount; /* Total number of rendered pixels */
uint64_t rayCount; /* Total number of rays */ uint64_t rayCount; /* Total number of rays object created */
uint64_t rayCasted; /* Total number of rays actually casted */
uint64_t lightRayEmitedCount; /* Total number of ray launched for light tests */ uint64_t lightRayEmitedCount; /* Total number of ray launched for light tests */
uint64_t reflectionRayCount; /* Total number of reflection ray launched */ uint64_t reflectionRayCount; /* Total number of reflection ray launched */
uint64_t refractedRayCount; /* Total number of refracted ray launched */ uint64_t refractedRayCount; /* Total number of refracted ray launched */
@@ -43,7 +44,8 @@ public:
RenderStats() : coneCount(0), cylinderCount(0), cubeCount(0), groupCount(0), lightCount(0), planeCount(0), sphereCount(0), triangleCount(0), RenderStats() : coneCount(0), cylinderCount(0), cubeCount(0), groupCount(0), lightCount(0), planeCount(0), sphereCount(0), triangleCount(0),
pixelCount(0), rayCount(0), lightRayEmitedCount(0), reflectionRayCount(0), refractedRayCount(0), pixelCount(0), rayCount(0), lightRayEmitedCount(0), reflectionRayCount(0), refractedRayCount(0),
intersectCount(0), intersectionCount(0), reallocCallCount(0), mallocCallCount(0), smoothTriangleCount(0), intersectCount(0), intersectionCount(0), reallocCallCount(0), mallocCallCount(0), smoothTriangleCount(0),
discardedIntersectCount(0), maxDepthAttained(UINT64_MAX), maxIntersectOnARay(0), objfileCount(0), csgCount(0) {}; discardedIntersectCount(0), maxDepthAttained(UINT64_MAX), maxIntersectOnARay(0), objfileCount(0),
csgCount(0), rayCasted(0) {};
#ifdef RENDER_STATS #ifdef RENDER_STATS
void addCone(); void addCone();
void addCylinder(); void addCylinder();
@@ -59,6 +61,7 @@ public:
void printStats(); void printStats();
void addPixel(); void addPixel();
void addRay(); void addRay();
void addCastedRay();
void addLightRay(); void addLightRay();
void addReflectRay(); void addReflectRay();
void addRefractRay(); void addRefractRay();
@@ -82,6 +85,7 @@ public:
static void printStats() {}; static void printStats() {};
static void addPixel() {}; static void addPixel() {};
static void addRay() {}; static void addRay() {};
static void addCastedRay() {};
static void addLightRay() {}; static void addLightRay() {};
static void addReflectRay() {}; static void addReflectRay() {};
static void addRefractRay() {}; static void addRefractRay() {};

View File

@@ -65,7 +65,7 @@ public:
ShapeType getType() { return this->type; }; ShapeType getType() { return this->type; };
virtual void intersect(Ray &r, Intersect &xs); virtual void intersect(Ray &r, Intersect &xs) { this->localIntersect(this->invTransform(r), xs); };
Tuple normalAt(Tuple point, Intersection *hit = nullptr); Tuple normalAt(Tuple point, Intersection *hit = nullptr);
uint64_t getObjectId() { return this->objectId; }; uint64_t getObjectId() { return this->objectId; };

View File

@@ -85,20 +85,32 @@ void RenderStats::addRay()
this->rayCount++; this->rayCount++;
}; };
void RenderStats::addCastedRay()
{
#pragma omp atomic
this->rayCasted++;
};
void RenderStats::addLightRay() void RenderStats::addLightRay()
{ {
this->addCastedRay();
#pragma omp atomic #pragma omp atomic
this->lightRayEmitedCount++; this->lightRayEmitedCount++;
}; };
void RenderStats::addReflectRay() void RenderStats::addReflectRay()
{ {
this->addCastedRay();
#pragma omp atomic #pragma omp atomic
this->reflectionRayCount++; this->reflectionRayCount++;
}; };
void RenderStats::addRefractRay() void RenderStats::addRefractRay()
{ {
this->addCastedRay();
#pragma omp atomic #pragma omp atomic
this->refractedRayCount++; this->refractedRayCount++;
}; };
@@ -172,7 +184,8 @@ void RenderStats::printStats()
printf("CSG : %lld\n", this->csgCount); printf("CSG : %lld\n", this->csgCount);
printf("==================================================\n"); printf("==================================================\n");
printf("Pixel rendered : %lld\n", this->pixelCount); printf("Pixel rendered : %lld\n", this->pixelCount);
printf("Ray casted : %lld\n", this->rayCount); printf("Ray created : %lld\n", this->rayCount);
printf("Ray casted : %lld\n", this->rayCasted);
printf("Light Ray casted : %lld\n", this->lightRayEmitedCount); printf("Light Ray casted : %lld\n", this->lightRayEmitedCount);
printf("Reflection ray casted : %lld\n", this->reflectionRayCount); printf("Reflection ray casted : %lld\n", this->reflectionRayCount);
printf("Refraction ray casted : %lld\n", this->refractedRayCount); printf("Refraction ray casted : %lld\n", this->refractedRayCount);

View File

@@ -36,12 +36,6 @@ uint64_t Shape::newObjectId()
return ret; return ret;
} }
void Shape::intersect(Ray &r, Intersect &xs)
{
this->localIntersect(this->invTransform(r), xs);
};
Tuple Shape::normalToWorld(Tuple normalVector) Tuple Shape::normalToWorld(Tuple normalVector)
{ {
Tuple world_normal = this->transposedInverseTransform * normalVector; Tuple world_normal = this->transposedInverseTransform * normalVector;

View File

@@ -229,13 +229,14 @@ int main()
w.addObject(s); w.addObject(s);
/* ----------------------------- */ /* ----------------------------- */
/*
FILE *fpOut = fopen("christmas_worlddump.json", "wt"); FILE *fpOut = fopen("christmas_worlddump.json", "wt");
if (fpOut) if (fpOut)
{ {
w.dumpMe(fpOut); w.dumpMe(fpOut);
fclose(fpOut); fclose(fpOut);
} }
*/
/* ----------------------------- */ /* ----------------------------- */

View File

@@ -117,14 +117,7 @@ int main()
w.addObject(dragon); w.addObject(dragon);
/* ----------------------------- */ /* ----------------------------- */
/*
FILE *fpOut = fopen("dragon_worlddump.json", "wt");
if (fpOut)
{
w.dumpMe(fpOut);
fclose(fpOut);
}
*/
OctreeOptimisation opt; OctreeOptimisation opt;
w.finalise(opt); w.finalise(opt);