Last weeks I have been working hard on optimizing our 3D engine JellyTouch. I have tried eventually all recommended methods to improve rendering performance and discovered that some of them work well, some provide small benefit and some don’t work at all. I think it is a good idea to share my results and probably have some feedback. The tests were performed on one of the most popular models – iPhone 3G 16GB.
This works well:
Triangle stripping. This classic technique which is often mentioned as obsolete nowadays still does its job. It has shown a dramatic performance boost in our tests, especially for large meshes. Try my triangle stripping utility to check how it works for you.
Using smaller data types for geometry. This reduces memory footprint for 3D objects and also improves performance significantly.
Using glDrawElements instead of glDrawArrays. It is indeed faster because it eliminates the need for repetitive vertices. Repetitive indices are much cheaper because they have smaller size.
This works but not so well:
Using smaller textures. Helps to save memory but doesn’t speed things up a lot. I only noticed a small speed gain.
Using V3_N3_T2 interleaving. In my tests it came out to be a little bit (approx. 2%) faster then other types of interleaving.
This doesn’t work:
PVRTC texture compression. It seems that this method is intended to reduce the size of the texture but not rendering performance. The FPS was even less then it was with plain PNG textures.
Using VBO. This actually works but only on iPhone 3GS and later devices to follow. Generations 3G and below don’t seem to benefit from this so probably VBO is not yet implemented although the API supports it.



Where Technology and Religion Collide
iPod Touch 4th Generation, iPad revision and new mysterious iDevice coming in autumn
How to install QuickTime Player 7 on Mac OS X 10.6 Snow Leopard without the DVD
Copy of an NSObject subclass
Android iPad knockoffs… pass
I also noticed no speed improvements with VBO lists. I actually saw my friends Gen 1 iPhone 3G 16Gig crash trying to use VBO, while the simulator and the iPod Touch 2nd Gen have no issues. I used your tutorial to double check my code but its sound.
I like your tips for speed, I’ll try a triangle strip model, see if this improves the fps on my friends gen1 iphone, it gets 8 fps, which didn’t seem right to me.
eSpecialized, if you are using dozens or hundereds of objects there is another thing that will boost your rendering speed – minimizing draw calls. Group objects by material and render them with a single call.
Our test was using a few big objects so it is not mentioned in the post but it works greatly.