Game Development Community

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
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;
      }

#1
04/08/2007 (8:26 am)
Replace with:

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...