Noções básicas sobre erros do Android Tight Loops / Spin-On-Suspend

Estou desenvolvendo um jogo no Android, 'Space RPG' - atualmente só vendo esse erro aparecer na maioria dos Galaxy S4s e HTC Ones. Isso tudo é Java.

O jogo irá parar, quando eu tentar depurar o processo e suspender o thread em questão, ele não será suspenso e ocorrerá um erro de rotação sobre suspensão. O dump de thread me permite ver que estava dentro de um certo loop while que está tomando uma 'posição final' desejada e iterando para trás em um passo de distância cada vez maior para encontrar uma 'posição inicial'.

É aqui que as coisas ficam chatas. Posso verificar que o loop não pode ser executado indefinidamente, mesmo que a condição seja while (true), não é possível que ele execute mais do que talvez 200 iterações antes que meu intervalo seja chamado (essa afirmação está sendo feita pelo código funcionando todos os outros telefones que eu tentei).

Para ajudar a aliviar minha mente sobre este assunto, adicionei uma variável incrementada simples dentro do loop, e se ele ultrapassar 1000, ele registrará algo para que eu possa ver que ele foi executado muitas vezes, caso alguma variável tenha sido definida. mal ou algo assim.Quando esse código do contador está presente, ocorre nenhum travamento / travamento. Também não vejo nenhum log indicando que ele foi executado mais de 1.000 vezes.

Se eu remover este contador, o travamento ocorre toda vez após 5-10 segundos de reprodução [no qual o loop while terá executado talvez 10 vezes, embora isso varie].

Minha pergunta é, então, o que diabos está acontecendo? : P Por que esses telefones mais recentes (mas aparentemente nenhum dos telefones mais antigos) têm um problema com um loop que está fazendo um trabalho válido e não dura muito tempo, quando não há nenhuma variável incrementada lá. Como o thread poderia possivelmente parar nesse loop e como ter uma variável de contador extra corrige o problema? Esse trabalho está sendo feito no encadeamento de renderização do opengl, caso isso seja importante.

Eu tenho relatos disso acontecendo na maioria dos S4s, mas há pelo menos um S4 lá fora, onde isso não aconteceu. O que estou usando hoje está acontecendo. Isso me faz pensar se poderia ter a ver com o android específico, java, dalvik ou outra coisa no telefone, mas infelizmente não tenho nenhum detalhe do S4 onde funcionou.

Qualquer ajuda, orientação, pensamentos ou outras leituras sobre coisas como esta seriam apreciadas, muito obrigado.

float vel = 1.0f; // final velocity is 1. We are working backwards to find out what the starting velocity will need to be.
int i = 0;
double xmath = Math.sin(rot* (Math.PI/180.0f)); // component of velocity for x,y direction based on rotation
double ymath =  Math.cos(rot* (Math.PI/180.0f));
while (true) {
        /* with this section uncommented, the stall never happens...
         ++i;
        if (i>1000) {
            // Something went rather wrong
            vel = 91.0f; // LOG WAS HERE, now has a fallback value justincase
            break;
        }
        */
        vel *= 1.2f;            
        dx -= vel* xmath;
        dy += vel* ymath;           
        if (distance < (float)Math.sqrt(dx*dx+dy*dy)) {
            break;
        }
}
// Give the ship a velocity that is appropriate for the distance remaining
_AI.Ship.Velocity = vel;

questionAnswers(1)

yourAnswerToTheQuestion