Alex Rivera | Logout

Advice on speeding up OpenGL ES 1.1 on the iPhone

Asked 2009-12-04T04:02:14.893
9

I'm working on an iPhone App that relies heavily on OpenGL. Right now it runs a bit slow on the iPhone 3G, but looks snappy on the new 32G iPod Touch. I assume this is hardware related. Anyway, I want to get the iPhone performance to resemble the iPod Touch performance. I believe I'm doing a lot of things sub-optimally in OpenGL and I'd like advice on what improvements will give me the most bang for the buck.

My scene rendering goes something like this:

  • Repeat 35 times
    • glPushMatrix
    • glLoadIdentity
    • glTranslate
    • Repeat 7 times
      • glBindTexture
      • glVertexPointer
      • glNormalPointer
      • glTexCoordPointer
      • glDrawArrays(GL_TRIANGLES, ...)
    • glPopMatrix

My Vertex, Normal and Texture Coords are already interleaved.

So, what steps should I take to speed this up? What step would you try first?

My first thought is to eliminate all those glBindTexture() calls by using a Texture Atlas.

What about some more efficient matrix operations? I understand the gl*() versions aren't too efficient.

What about VBOs?

Update

There are 8260 triangles. Texture sizes are 64x64 pngs. There are 58 different textures.

I have not run instruments.

Update 2

After running the OpenGL ES Instrument on the iPhone 3G I found that my Tiler Utilization is in the 90-100% range, and my Render Utilization is in the 30% range.

Update 3

Texture Atlasing had no noticeable affect on the problem. Utilization ranges are still as noted above.

Update 4

Converting my Vertex and Normal pointers to GL_SHORT seemed to improve FPS, but the Tiler Utilization is still in the 90% range a lot of the time. I'm still using GL_FLOAT for my texture coordinates. I suppose I could knock

Edit
Report

1 Answer

4

If you only have 58 different 64x64 textures, a texture atlas seems like a good idea, since they'd all fit in a single 512x512 texture... if you don't rely on texture wrap modes, I'd certainly at least try this.

What format are your textures in? You might try using a compressed PVRTC texture; I think that's less load on the Tiler, and I've been pleasantly surprised by the image quality even for 2-bit-per-pixel textures. (Good for natural images, not good if you're doing something that looks like an 8-bit video game)

answered 2009-12-04T05:48:40.590

Your Answer