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:
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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() {};
|
||||||
|
|||||||
@@ -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; };
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
/* ----------------------------- */
|
/* ----------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user