Hi All

I got a considerable boost in the frame rate from the following
patch to PLib. < ~25% at default startup location >

I am trying to determine if this also true for 'most' systems
before advocating it's inclusion into PLib

If you do test this please report back with your results
and system type < OS, CPU, GFX card >

Thanks

Norman 

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED]] On Behalf Of Darrell
Walisser
Sent: Sunday, June 30, 2002 10:27 PM
To: [EMAIL PROTECTED]
Subject: [Plib-devel] ssg vertex tables tuning


Hi all,
        While running FlightGear, I noticed a problem with PLIB's vertex 
tables. The implementation is fine, but performance was hideous on Mac 
OS X (like 5fps), even on a fast G4.  I'm really curious if this is also 
a problem on other OS's.

After some examination, it seems the majority of FlightGear's geometry 
is rendered in small triangle fans, of 5-10 vertices each, with the 
occasional big lump of vertices in a detailed area. Why is this a 
problem? Well, it turns out that the setup time for vertex arrays is 
actually slower than glVertex3fv() etc because there are so few vertices 
per table.

So, I coded a solution that only kicks into the vertex array code if the 
number of vertices is beyond a certain threshold, otherwise it uses 
glVerte3fv(). I picked 25 as the lower bound for vertex arrays, but this 
value is probably highly system-dependent and we might want to make it 
configurable either at build-time or run-time.

Here's the code (for ssgVtxTable.cxx). Having different versions of the 
inner loop is probably overkill, but you get the idea:

void ssgVtxTable::draw_geometry ()
{
   const int LOWER_BOUND = 25;

   int num_vertices  = getNumVertices  () ;
   int num_colours   = getNumColours   () ;
   int num_normals   = getNumNormals   () ;
   int num_texcoords = getNumTexCoords () ;

   if ( num_colours == 0 ) glColor4f   ( 1.0f, 1.0f, 1.0f, 1.0f ) ;
   if ( num_colours == 1 ) glColor4fv  ( colours -> get(0) ) ;
   if ( num_normals == 1 ) glNormal3fv ( normals -> get(0) ) ;

   #define LOOP(c,n,t) do {                     \
     glBegin(gltype);                           \
     for ( int i = 0; i < num_vertices; i++)    \
     {                                          \
       if(c) glColor3fv(colors[i]);             \
       if(n) glNormal3fv(normals[i]);           \
       if(t) glTexCoord2fv(texcoords[i]);       \
       glVertex3fv(vertices[i]);                        \
     }                                          \
     glEnd();                                    \
   } while(0)

   // write out the branches
   // to keep branches out of the inner loop
   if (num_vertices < LOWER_BOUND) {

     float *tmp;
     tmp = colours->get(0);   sgVec4 *colors    = (sgVec4*) tmp;
     tmp = normals->get(0);   sgVec3 *normals   = (sgVec3*) tmp;
     tmp = texcoords->get(0); sgVec2 *texcoords = (sgVec2*) tmp;
     tmp = vertices->get(0);  sgVec3 *vertices  = (sgVec3*) tmp;

     if ( num_colours > 1 ) {
       if ( num_normals > 1 ) {
        if ( num_texcoords > 1 )
          LOOP(1,1,1);
        else
           LOOP(1,1,0);
       }
       else if ( num_texcoords > 1 ) {
        LOOP(1,0,1);
       }
       else {
         LOOP(1,0,0);
       }
     }
     else if ( num_normals > 1 )  {
       if ( num_texcoords > 1 ) {
         LOOP(0,1,1);
       }
       else {
        LOOP(0,1,0);
       }
     }
     else if ( num_texcoords > 1 ) {
       LOOP(0,0,1);
     }
     else {
       LOOP(0,0,0);
     }

   }
   else {

     glPushClientAttrib ( GL_CLIENT_VERTEX_ARRAY_BIT ) ;

     if ( num_colours > 1 )
     {
       glEnableClientState ( GL_COLOR_ARRAY ) ;
       glColorPointer ( 4, GL_FLOAT, 0, colours->get(0) ) ;
     }

     if ( num_normals > 1 )
     {
       glEnableClientState ( GL_NORMAL_ARRAY ) ;
       glNormalPointer ( GL_FLOAT, 0, normals->get(0) ) ;
     }

     if ( num_texcoords > 1 )
     {
       glEnableClientState ( GL_TEXTURE_COORD_ARRAY ) ;
       glTexCoordPointer ( 2, GL_FLOAT, 0, texcoords->get(0) ) ;
     }

     glEnableClientState ( GL_VERTEX_ARRAY ) ;
     glVertexPointer ( 3, GL_FLOAT, 0, vertices->get(0) ) ;

     glDrawArrays ( gltype, 0, num_vertices ) ;

     glPopClientAttrib () ;
   }
}



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
plib-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/plib-devel


_______________________________________________
Flightgear-devel mailing list
[EMAIL PROTECTED]
http://mail.flightgear.org/mailman/listinfo/flightgear-devel

Reply via email to