Wow, you're disturbingly main RAM limited. That screams sub-optimal usage patterns. There are probably more cache-friendly ways you can be using that framebuffer..
No doubt. Every frame of the game starts by blitting a 800x480 static background (that only changes every second or so), then drawing all the enemies and effects on top of that, then blitting a 800x480 overlay (at some offset) with alpha-blending on top of that, and then in the main menu that's followed by blitting all of the text surfaces and other menu stuff on top of that. So that's quite RAM intensive, but I wouldn't know how to make something like that cache-friendlier. Do you have any suggestions?
Oh and I did the benchmarks with a version without compiler optimizations (-O0), so that probably also has a small impact - although I doubt it, given that most time is spent in the SDL blitters and not in my code, but let me check anyway with a more typical -O2 build...
at 388/2MHz, I get 44.11 FPS (12.75% speedup for a 16.87% overclock)
at 332/2MHz, I get 39.12 FPS
at 300/2MHz, I get 34.99 FPS
at 200/2MHz, I get 21.39 FPS
at 100/2MHz, I get 7.6 FPS
Yep, looks like it's still RAM-bottlenecked.
It's not really a big problem for Microbes - it's designed for 30 FPS and the actual game is graphically less demanding than the main menu because 1) the actual game window is a bit smaller than 800x480 and 2) there's no menu to render, so it shouldn't be a big problem to get the 30 FPS it needs. But I would still be interested in optimizing the performance, if only to save some battery life