Я хочу оптимизировать работу батареи, уменьшив частоту кадров до 1 Гц. Приложение представляет собой панель управления, которая обновляется только один раз в секунду, не имеет анимации и не является интерактивной. Можно ли установить частоту обновления OLED-дисплея на 1 Гц?
Я попытался установить CADisplayLink в делегате приложения, но это не имело никакого значения.
Apple упоминает об использовании этого подхода на WWDC 2022, но я могу заставить его работать в моем приложении SwiftUI.
Частота обновления является функцией всего экрана. Вы не можете в одностороннем порядке контролировать это самостоятельно. Возможно, потребуется обновить другие элементы экрана, которые не относятся к вашему приложению (строка состояния, динамический остров). Различные технологии экрана также требуют разной минимальной частоты обновления, чтобы изображение оставалось четким. Ничто из этого не находится под контролем вашего приложения.
Минимальная частота обновления для дисплеев ProMotion, общей технологии для устройств Pro/Max более высокого класса, составляет 10 Гц. Я не знаю ни одного экрана iPhone или iPad, поддерживающего частоту обновления 1 Гц.
Лучший способ оптимизировать производительность обновления экрана в SwiftUI — не делать недействительными любые представления без необходимости. В зависимости от этого ОС настроит частоту обновления. Если вы используете SwiftUI и не аннулируете без необходимости свои представления, то я ожидаю, что на телефоне ProMotion он будет работать с частотой 10 Гц. Я думаю, что видел частоту 10 Гц и на своих устройствах, отличных от ProMotion, но прошло много времени с тех пор, как я ее проверял.
Вам нужно использовать CADisplayLink только в том случае, если вы выполняете собственный рендеринг. Вам следует избегать этого, если это возможно, но Apple предоставляет вам инструменты, если они вам нужны. Для вашей ситуации (чистый SwiftUI) весь ответ таков: «не делайте недействительными ваши представления чаще, чем это необходимо». Больше ничего вы не можете и не должны делать.
Спасибо за ваш ответ. Что странно, у меня нет анимации, я обновляю состояние раз в секунду и использую iPhone с ProMotion. Частота кадров фиксируется на уровне 60 кадров в секунду. Когда я переключаюсь в режим низкого энергопотребления, частота падает до 10 кадров в секунду. Я пытаюсь воспроизвести поведение режима низкого энергопотребления, не включая его.
Я получаю желание, и это имеет смысл. Но возможно, Apple сделала для пользователя выбор, который вы не сможете исправить. Вы можете попробовать сделать свое приложение полноэкранным. (.fullScreenCover
может здесь помочь). Возможно, строка состояния или динамический остров запрашивают более быстрые обновления. Вы также можете поэкспериментировать с полноэкранным рендерингом вручную (возможно, MetalKit), чтобы посмотреть, сможете ли вы получить желаемое обновление, а затем изучить, как поместить в него свое представление SwiftUI (что-то вроде Developer.apple.com/documentation/metal/ …). Я не знаю, сработает ли это.
Хороший вопрос! Я попробую.
Если вы опубликуете реальный код, который вы пробовали, кто-то, возможно, сможет помочь его исправить.