Android-приложение с высоким использованием процессора и разрядкой аккумулятора - PullRequest
0 голосов
/ 19 ноября 2018

Я уже некоторое время работаю над игрой для Android.У меня реализована основная игра, так что теперь я возвращаюсь и пытаюсь оптимизировать.Кажется, что заряд батареи и использование процессора слишком высоки для того, что я делаю.У меня действительно есть только мой основной поток, а затем все рисование и обновление выполняются в отдельном потоке.

Ниже приведен код для реального игрового потока, который выполняет обновление, и всего рисования.Весь фактический код был удален, осталось то, с чем я экспериментировал, чтобы выяснить ненормальное использование процессора / разрядку батареи.

Так что, в принципе, если я запускаю нижеследующий поток только с бесконечным циклом в то время как приложение использует около 315 мАч или около 9% батареи моего телефона за 30 минут использования.Если я запускаю поток без кода внутри метода run, чтобы он истекал после одного прохода, он расходует примерно 70 мАч или 2% батареи телефона за то же время.Загрузка ЦП также увеличивается с 2% -3% без выполнения потока до примерно 14% -15%, когда поток работает и просто выполняет бесконечный цикл.

Подводя итог, кажется, что запуск потока только с бесконечным циклом while, который ничего не делает, увеличивает использование батареи на 7% в течение 30 минут.Я не понимаю, как это возможно, и думаю, что я что-то упускаю.Я буду продолжать работать, чтобы понять это, но больше нет кода, который можно взять.Если у кого-то есть какие-либо предложения или они могут дать некоторое представление о том, почему это происходит, я буду очень признателенЗаранее спасибо.

class InnerThread extends Thread
    {
        public InnerThread()
        {
            super();
        }

        public void run()
        {
           while(true){}
        }
    }

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Циклы без задержки или стимуляции, как известно, перегружают процессор и батарею.Тщательно продумайте, действительно ли вам нужно обрабатывать непрерывно, или достаточно будет один раз за кадр, один раз за произвольный интервал времени или один раз каждый раз, когда происходит какое-то внешнее событие.Попробуйте добавить небольшую произвольную задержку в цикл, и вы, вероятно, увидите немедленное улучшение.

Во многих играх используется основной цикл игры .Это поисковый термин.По сути, бесконечный цикл выполняет некоторые вычисления, рисует кадр, а затем обычно спит некоторое время.(См. SystemClock.sleep () против Thread.sleep () .) Ваш основной цикл может передавать номер кадра и метку времени остальной части кода.Вы можете вычислять позиции движущихся объектов в каждом кадре, но вы можете делать более сложные вещи, такие как обновление ИИ ваших врагов только через определенные промежутки времени или кадры.Если вы используете игровой движок, такой как Unity, основной цикл все еще там, но вы не пишете его сами.Вы просто пишете код, который он вызывает каждый кадр.

0 голосов
/ 24 ноября 2018

Я прошел и отредактировал свой код. Использование thread.sleep для ограничения общего рисования и обновления кода до 60 кадров в секунду. Также я использовал методы Object.wait () и Object.notify (), чтобы уменьшить ненужную обработку потока. Я видел огромные улучшения, спасибо за помощь, я действительно ценю это. Моя проблема заключалась в том, что я совершенно не тратил энергию батареи и процессора.

0 голосов
/ 19 ноября 2018

while(true) - это классический бесконечный цикл, который, вероятно, не требуется в Java.

это даже не имеет значения, по какому потоку он работает, скорее всего, он сливает сок.

см. Неужели циклы "while (true)" такие плохие?

...