Zrozumienie błędu pętli naprężenia w systemie Android / błędu włączania-zawieszania

Opracowuję grę na Androida „Space RPG” - obecnie widzę tylko ten błąd pojawiający się na większości Galaxy S4s i HTC Ones. To wszystko jest Java.

Gra zatrzyma się, gdy spróbuję zdebugować proces i zawiesić wątek, którego dotyczy problem, nie zawiesi się, a wystąpi błąd zawieszenia. Zrzut wątku pozwala mi zobaczyć, że znajdował się w pewnej pętli, która przyjmuje pożądaną „pozycję końcową” i iteruje do tyłu w coraz większej odległości, aby znaleźć „pozycję początkową”.

W tym miejscu irytują rzeczy. Mogę sprawdzić, czy pętla nie może działać w nieskończoność, nawet jeśli warunek jest podczas (prawda), nie jest możliwe, aby uruchomił więcej niż 200 iteracji, zanim moja przerwa zostanie wywołana (to potwierdzenie jest wspierane przez kod działający na co drugi telefon próbowałem).

Aby pomóc mi w tej sprawie, dodałem prostą zmienną inkrementowaną wewnątrz pętli i jeśli kiedykolwiek przekroczy 1000, to coś się zaloguje, więc widzę, że DID działał zbyt wiele razy, na wypadek, gdyby ustawiono jakąś zmienną źle lub coś.Gdy ten kod licznika jest obecny, NIE występuje zawieszenie / zawieszenie. Nie widzę też żadnych dzienników wskazujących, że działa ponad 1000 razy.

Jeśli usuwam ten licznik, zawieszenie pojawia się za każdym razem po 5-10 sekundach odtwarzania [w którym pętla while będzie działać może 10 razy, choć będzie się to zmieniać].

Moje pytanie brzmi zatem: co się do cholery dzieje? : P Dlaczego te nowsze telefony (ale pozornie żaden ze starszych telefonów) nie mają problemu z pętlą, która wykonuje prawidłową pracę i nie trwa długo, gdy nie ma tam zmiennej inkrementalnej. W jaki sposób wątek może utknąć w tej pętli i jak posiadanie dodatkowej zmiennej licznika rozwiązuje problem? Ta praca jest wykonywana w wątku renderowania opengl, w przypadku, gdy jest to ważne.

Mam doniesienia o tym, że dzieje się to na większości S4, ale jest tam co najmniej jeden S4, gdzie to się nie stało. Ten, którego używam dzisiaj, się dzieje. To sprawia, że ​​zastanawiam się, czy to może być związane z konkretnym androidem, javą, dalvikiem lub czymś innym w telefonie, ale niestety nie mam żadnych danych z S4, gdzie działało.

Każda pomoc, wskazówki, przemyślenia lub dalsze czytanie na temat takich rzeczy byłyby mile widziane, wielkie dzięki.

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