Slight optimization
by Stephen Lujan · in Torque Game Engine · 04/08/2007 (8:26 am) · 1 replies
I've read up a bit on rendering optimizations, and decided to see if there was anything to apply it to in torque. I really don't know enough about the rendering in torque to know whether this optimization is at all worthwhile, or just shaves a couple milliseconds but here's what I did.
in the file "engine\terrain\terrRender.cc" (about line 2288) change this
in the file "engine\terrain\terrRender.cc" (about line 2288) change this
LightTriangle* walkLT = sgCurrLightTris;
while(walkLT)
{
if(walkLT->flags)
{
if(blendedlighting)
{
F32 invLevel = 1.0f / F32(mSquareSize << walkLT->chunkTexture->level);
sgTexGenS.set(invLevel, 0.0f, 0.0f, -(walkLT->chunkTexture->x >> walkLT->chunkTexture->level));
sgTexGenT.set(0.0f, invLevel, 0.0f, -(walkLT->chunkTexture->y >> walkLT->chunkTexture->level));
glBindTexture(GL_TEXTURE_2D, walkLT->chunkTexture->handle.getGLName());
}
glBegin(GL_TRIANGLES);
glColor4fv(walkLT->color);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, walkLT->texco1.x, walkLT->texco1.y);
if(blendedlighting)
{
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
custom_dot(sgTexGenS, walkLT->point1),
custom_dot(sgTexGenT, walkLT->point1));
}
glVertex3fv(walkLT->point1);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, walkLT->texco2.x, walkLT->texco2.y);
if(blendedlighting)
{
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
custom_dot(sgTexGenS, walkLT->point2),
custom_dot(sgTexGenT, walkLT->point2));
}
glVertex3fv(walkLT->point2);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, walkLT->texco3.x, walkLT->texco3.y);
if(blendedlighting)
{
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
custom_dot(sgTexGenS, walkLT->point3),
custom_dot(sgTexGenT, walkLT->point3));
}
glVertex3fv(walkLT->point3);
glEnd();
}
walkLT = walkLT->next;
}About the author
Torque Owner Stephen Lujan
LightTriangle* walkLT = sgCurrLightTris; if(blendedlighting) { while(walkLT) { if(walkLT->flags) { F32 invLevel = 1.0f / F32(mSquareSize << walkLT->chunkTexture->level); sgTexGenS.set(invLevel, 0.0f, 0.0f, -(walkLT->chunkTexture->x >> walkLT->chunkTexture->level)); sgTexGenT.set(0.0f, invLevel, 0.0f, -(walkLT->chunkTexture->y >> walkLT->chunkTexture->level)); glBindTexture(GL_TEXTURE_2D, walkLT->chunkTexture->handle.getGLName()); glColor4fv(walkLT->color); glBegin(GL_TRIANGLES); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, walkLT->texco1.x, walkLT->texco1.y); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, custom_dot(sgTexGenS, walkLT->point1), custom_dot(sgTexGenT, walkLT->point1)); glVertex3fv(walkLT->point1); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, walkLT->texco2.x, walkLT->texco2.y); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, custom_dot(sgTexGenS, walkLT->point2), custom_dot(sgTexGenT, walkLT->point2)); glVertex3fv(walkLT->point2); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, walkLT->texco3.x, walkLT->texco3.y); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, custom_dot(sgTexGenS, walkLT->point3), custom_dot(sgTexGenT, walkLT->point3)); glVertex3fv(walkLT->point3); glEnd(); } walkLT = walkLT->next; } } else { while(walkLT) { if(walkLT->flags) { glColor4fv(walkLT->color); glBegin(GL_TRIANGLES); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, walkLT->texco1.x, walkLT->texco1.y); glVertex3fv(walkLT->point1); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, walkLT->texco2.x, walkLT->texco2.y); glVertex3fv(walkLT->point2); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, walkLT->texco3.x, walkLT->texco3.y); glVertex3fv(walkLT->point3); glEnd(); } walkLT = walkLT->next; } }Just to summarize I cut down on the stuff between glBegin and glEnd by 3 conditionals and the set color command. The three conditionals that were run once per loop are replaced by a single conditional run once. Now from what I've read, cutting down on unnecessesary calculations between glBegin and glEnd is important but its also important to reduce the number of overall glBegin and glEnd statements. I could have put glBegin and glEnd outside the while loop but I'm not sure that would make a net improvement...