you always wait for a fixed time here, no matter how long all calculations and updates ui take
frame.postDelayed(frameUpdate, FRAME_RATE);
what you want to do: before the new "tick of the game" you create the variable timestamp, then you perform the calculations and then check how much time is left until the next tick.
something like that:
synchronized public void run() {
Date timestamp = new Date();
...
int timeToNextTick = FRAME_RATE - (new Date().getTime() - timestamp.getTime());
frame.postDelayed(frameUpdate, timeToNextTick);
}
, (, )