OpenGL Performance Tips

These programming practices optimize your application's performance:

  • Use glColorMaterial when only a single material property is being varied rapidly (at each vertex, for example). Use glMaterial for infrequent changes, or when more than a single material property is being varied rapidly.
  • Use glLoadIdentity to initialize a matrix, rather than loading your own copy of the identity matrix.
  • Use specific matrix calls such as glRotate, glTranslate, and glScale, rather than composing your own rotation, translation, and scale matrices and calling glMultMatrix.
  • Use glPushAttrib and glPopAttrib to save and restore state values. Use query functions only when your application requires the state values for its own computations.
  • Use display lists to encapsulate potentially memory-intensive state changes. For example, place all the glTexImage calls required to completely specify a texture (and perhaps the associated glTexParameter, glPixelStore, and glPixelTransfer calls as well) into a single display list. Call this display list to select the texture.
  • Use display lists to encapsulate the rendering calls of rigid objects that will be drawn repeatedly.
  • To minimize network bandwidth in client/server environments, use evaluators even for simple surface tessellations.
  • If possible, to avoid the overhead of GL_NORMALIZE, provide unit-length normals. Because glScale almost always requires enabling GL_NORMALIZE, avoid using glScale when doing lighting.
  • If smooth shading isn't required, set glShadeModel to GL_FLAT.
  • Use a single glClear call per frame, if possible. Do not use glClear to clear small subregions of the buffers; use it only to clear the buffer completely or nearly completely.
  • To draw multiple independent triangles, use a single call rather than multiple calls to glBegin ( GL_TRIANGLES ) or a call to glBegin ( GL_POLYGON ). Similarly:

    To draw a single triangle, use GL_TRIANGLES rather than GL_POLYGON.

    Use a single call to glBegin ( GL_QUADS ) rather than calling glBegin ( GL_POLYGON ) repeatedly.

    Use a single call to glBegin ( GL_LINES ) to draw multiple independent line segments, rather than calling glBegin ( GL_LINES ) multiple times.

  • In general, use the vector forms of commands to pass precomputed data, and use the scalar forms of commands to pass values that are computed near call time.
  • Avoid making redundant mode changes, such as setting the color to the same value between each vertex of a flat-shaded polygon.
  • When drawing or copying images, disable rasterization and per-fragment operations, to optimize resources. OpenGL can apply textures to pixel images.