Есть несколько логических ошибок, которые указаны / обсуждены в комментариях ниже:
endingTime = System.currentTimeMillis();
timeElapsed = (int) (endingTime - startingTime);
// Why is the "elapsed" time being waited? Hmm.
// If *any* wait is being done (I'd recommend sleep(0) for starters)
// it should be the MAXIMUM desired cycle time MINUS the
// currently used cycle time (MINUS some fudge factor).
if (timeElapsed < UPDATE_INTERVAL) // I dislike hanging blocks...
try {
Thread.sleep(timeElapsed);
} catch (InterruptedException e) {
e.printStackTrace();
}
startingTime = System.currentTimeMillis();
// The game needs to know the TOTAL time elapsed since
// the last update, not the time "until before the yield".
// This will likely be passed fictitiously small values as
// it is only time the the LAST updateGame took to run.
Game.updateGame(timeElapsed);
Я бы никогда не ожидал увидеть timeElapsed (переданное в updateGame) ниже, скажем, 10 мс с sleep(...)
и исправленными расчетами времени.
Однако, он может не обладать требуемой точностью (увеличение минимальной продолжительности цикла, скажем, до 1/30 секунды, что будет результатом фиксированной математики, сделает это менее важным): см. Ответ Кристиана Враби для предложения по таймеру с более высоким разрешением. (Могут быть и некоторые лучшие сторонние альтернативы, разработанные специально для этого - в «нормальной» Java - я не программирую Android; -)
Удачного кодирования.