Как я могу уменьшить частоту кадров в приложении SwiftUI?

Я хочу оптимизировать работу батареи, уменьшив частоту кадров до 1 Гц. Приложение представляет собой панель управления, которая обновляется только один раз в секунду, не имеет анимации и не является интерактивной. Можно ли установить частоту обновления OLED-дисплея на 1 Гц?

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

Apple упоминает об использовании этого подхода на WWDC 2022, но я могу заставить его работать в моем приложении SwiftUI.

Если вы опубликуете реальный код, который вы пробовали, кто-то, возможно, сможет помочь его исправить.

Scott Hunter 16.08.2024 18:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Минимальная частота обновления для дисплеев ProMotion, общей технологии для устройств Pro/Max более высокого класса, составляет 10 Гц. Я не знаю ни одного экрана iPhone или iPad, поддерживающего частоту обновления 1 Гц.

Лучший способ оптимизировать производительность обновления экрана в SwiftUI — не делать недействительными любые представления без необходимости. В зависимости от этого ОС настроит частоту обновления. Если вы используете SwiftUI и не аннулируете без необходимости свои представления, то я ожидаю, что на телефоне ProMotion он будет работать с частотой 10 Гц. Я думаю, что видел частоту 10 Гц и на своих устройствах, отличных от ProMotion, но прошло много времени с тех пор, как я ее проверял.

Вам нужно использовать CADisplayLink только в том случае, если вы выполняете собственный рендеринг. Вам следует избегать этого, если это возможно, но Apple предоставляет вам инструменты, если они вам нужны. Для вашей ситуации (чистый SwiftUI) весь ответ таков: «не делайте недействительными ваши представления чаще, чем это необходимо». Больше ничего вы не можете и не должны делать.

Спасибо за ваш ответ. Что странно, у меня нет анимации, я обновляю состояние раз в секунду и использую iPhone с ProMotion. Частота кадров фиксируется на уровне 60 кадров в секунду. Когда я переключаюсь в режим низкого энергопотребления, частота падает до 10 кадров в секунду. Я пытаюсь воспроизвести поведение режима низкого энергопотребления, не включая его.

Elie 16.08.2024 20:48

Я получаю желание, и это имеет смысл. Но возможно, Apple сделала для пользователя выбор, который вы не сможете исправить. Вы можете попробовать сделать свое приложение полноэкранным. (.fullScreenCover может здесь помочь). Возможно, строка состояния или динамический остров запрашивают более быстрые обновления. Вы также можете поэкспериментировать с полноэкранным рендерингом вручную (возможно, MetalKit), чтобы посмотреть, сможете ли вы получить желаемое обновление, а затем изучить, как поместить в него свое представление SwiftUI (что-то вроде Developer.apple.com/documentation/metal/ …). Я не знаю, сработает ли это.

Rob Napier 16.08.2024 22:12

Хороший вопрос! Я попробую.

Elie 16.08.2024 23:09

Другие вопросы по теме