Подтвердить что ты не робот

Как измерить и улучшить использование батареи в iPhone/iPad (Android также)

В моей игре слишком много батарей. Я не знаю точно, сколько он использует по сравнению с сопоставимыми играми, но он использует слишком много. Игроки жалуются, что он много использует, и некоторые из них отмечают, что это делает их устройство "горячим". Я только начинаю исследовать это и хотел бы задать некоторые теоретические и практические вопросы, чтобы сузить пространство поиска. Это в основном о версии iOS для моей игры, но, вероятно, многие из этих же проблем влияют на версию Android. Извините, что задал много вопросов, но все они были настолько взаимосвязаны. Я думал, что лучше всего держать их вместе.

Боковые заметки: в моей игре нет доступа к сети (вызывается в нескольких местах как большой разряд батареи) и не потребляет много батареи в фоновом режиме; это проблема переднего плана, которая является проблемой.

(1) Я знаю, что есть API-интерфейсы для чтения уровня заряда батареи, поэтому я могу провести автоматическое тестирование. Мой вопрос здесь: о том, как долго (или, может быть, о том, как сильно разряжен аккумулятор) мне нужно, чтобы эта вещь работала, чтобы получить надежное чтение? Например, если он работает в течение 10 минут, это надежный? Если он истощает 10% батареи, это надежный? Или лучше работать в течение часа (или, скажем, посмотреть, сколько времени потребуется, чтобы батарея разрядилась на 50%)? Я спрашиваю здесь, насколько чувствителен/надежен счетчик батареи, поэтому я знаю, как долго должен проходить каждый тестовый прогон.

(2) Я пытаюсь понять, каковы вероятные причины использования батареи. Ниже перечислены некоторые возможные факторы. Пожалуйста, помогите мне понять, какие из них являются наиболее вероятными виновниками:

(2a) Как и в случае с множеством игр, моя игра должна рисовать весь экран на каждом кадре. Он работает со скоростью около 30 кадров в секунду. Я знаю, что Apple говорит, что "обновлять экран нужно столько, сколько вам нужно", но мне очень нужно рисовать каждый кадр. Фактически, я мог бы поработать над тем, чтобы изменить только части экрана, которые изменились, но в моем случае это будет большая часть экрана. И в любом случае, даже если я смогу локализовать чертеж только на части экрана, я все равно делаю вызовы буферов OpenGL 30 раз в секунду, так что действительно ли важно, что я много работал, чтобы рисовать немного меньше

(2b) Когда я рисую элементы экрана, происходит определенное количество математики с плавающей запятой, которая продолжается (например, при вычислении текстурных UV-координат), и некоторая (меньшая) математика с двойной точностью, которая продолжается. Я не знаю, насколько это дорого, по сравнению с аналогичными целыми операциями. Я мог бы, вероятно, кэшировать многие из этих значений, чтобы не приходилось многократно их вычислять, если это была вероятная победа.

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

(2d) Я не уверен, что это будет практично для меня, но: я читал о шейдерах и OpenCL, и я хочу понять, должен ли я выгружать часть обработки процессора на GPU, независимо от того, вероятно, сэкономит аккумулятор (в дополнение к предположительно более быстрому функционированию векторного типа). Или, возможно, он использовал бы еще больше батареи на графическом процессоре, чем на процессоре?

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

4b9b3361

Ответ 1

Попробуйте прочитать эту статью: Документация по оптимизации Android

Что хорошо работает для меня, уменьшает использование для сбора мусора, например, при программировании для настольного компьютера вы (или я) используются для определения переменных внутри циклов, когда они не нужны вне цикла, это приводит к массовому использованию сборки мусора (и я не говорю о примитивных vars, но большие объекты.

старайтесь избегать подобных вещей.

Ответ 2

Один маленький совет, который действительно помог мне получить использование батареи (и теплое устройство!) вниз, состоял в том, чтобы сжать FPS в моем обычном OpenGL Engine.

Особенно, когда сцена статична (например, пошаговая игра или пользовательская пауза), дросселируйте FPS. Или дроссельная заслонка, если пользователь не реагирует на более чем 10 секунд, как заставка на ПК. В реальном мире пользователи часто отвлекаются при использовании мобильных устройств. Не позволяйте своему приложению разряжать батарею, пока ваш пользователь определяет, на какой станции метро он находится;)

Также на iPhone, иногда 60FPS по умолчанию, дросселирование этого вручную до 30 FPS едва видно и защищает вас примерно половину циклов gpu (и, следовательно, много батареи!).