Понимание Android Tight Loop / Spin-On-Suspend ошибка

Я разрабатываю игру на Android,Космическая РПГ ' - в настоящее время эта ошибка появляется только на большинстве Galaxy S4s и HTC Ones. Это все Java.

Игра остановится, когда я попытаюсь отладить процесс и приостановить обсуждаемую нить, она выиграетt приостановить, и происходит ошибка вращения при приостановке. Дамп потока позволяет мне увидеть, что он был внутри определенного цикла while, который принимает желаемое значениеконечная позиция и итерации назад на все возрастающем шаге расстояния, чтобы найти 'стартовая позиция ».

Это где вещи становятся раздражающими. Я могу убедиться, что цикл не может выполняться бесконечно, даже если условие имеет время (true), он не может выполнить больше, чем, может быть, 200 итераций, прежде чем будет вызван мой разрыв (это утверждение подтверждается кодом, работающим над любой другой телефон, который я пробовал).

Чтобы облегчить свой ум в этом вопросе, я добавил в цикл простую инкрементную переменную, и если она когда-либо превысит 1000, она что-то выйдет из системы, так что я вижу, что она выполнялась слишком много раз, на случай, если была установлена какая-то переменная плохо или что-то.Когда этот код счетчика присутствует, сбой / зависание НЕТ. Также я не вижу никаких журналов, указывающих, что это бежало более 1000 раз.

Если я уберу этот счетчик, зависание будет происходить каждый раз после 5-10 секунд игры [в котором цикл while будет выполняться, может быть, 10 раз, хотя это варьируется].

Поэтому мой вопрос, что, черт возьми, происходит? : P Почему эти новые телефоны (но, похоже, ни один из старых телефонов) не имеют проблемы с циклом, который выполняет корректную работу и не 'т длится долго, когда там нет увеличенной переменной. Как поток может зависнуть в этом цикле, и как с помощью дополнительной переменной counter решить проблему? Эта работа выполняется в потоке рендеринга opengl, если это важно.

У меня есть сообщения об этом на большинстве S4, но есть по крайней мере один S4 там, где он неэто случилось. Тот, который я использую сегодня, это происходит. Это заставляет меня задуматься, может ли это быть связано с конкретным android, java, dalvik или чем-то еще на телефоне, но, к сожалению, у меня нет каких-либо подробностей с S4, где он работал.

Буду признателен за любую помощь, руководство, мысли или дальнейшее чтение на такие вещи, спасибо большое.

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;

Ответы на вопрос(1)

Ваш ответ на вопрос