You were completely correct - it is a cpu throttling problem. For some reason I thought that worked on longer timescales - seems it can change 50 times a second. And, in the absence of a thread to soak up the idle time, the profiling from eclipse/Android shows no gaps, suggesting that the system is working flat out. The more I tightened my code the worse, in a sense, I made the problem.
That's the good news, lol. The bad news is that it seems to have brought a load of SharedBufferStack lock timeout errors out of the woodwork. This basically stops the App for 1 or 2 seconds. It seems to be a fairly common problem - some developers reporting that it can even shut down phones. Some suggest that non-square textures are the problem, others that having an overlaid normal view/canvas is bad. The latter doesn't work for me, the former changes the timing quite noticeably so it may not have fixed it, merely pushed the problem into a different set of test conditions. All of my textures are PO2. Any knowledge of this?
Since you are clearly on a roll
do you have any suggestions for what might cause tearing (I think that is the appropriate term - my OpenGL experience stretches back only a few months)? During animation i will get the odd frame where a random small piece is incorrectly rendered - like one part of my compositing has not happened, leaving wrong colours. Where might I look? I am using direct buffers everywhere except when doing glReadPixels. I found a terrible bug in Android 3.0+ where the direct allocation routine actually reserves 4 times as much memory as requested, thus blowing my App out of the water when I need to save rendered frames.
Sorry to have asked you another cpl of questions, but I have asked these things on a number of forums and not received any sensible replies. The port of my graphically intensive App to OpenGL is essentially done, but unusable unless I can nail down these issues.
Once again, thank you very much for your "throttling" answer. I guess too many years working on parallel architectures and the misleading traces led me to look for something too complicated, lol.