Эффективность процессора во время анимации - PullRequest
0 голосов
/ 26 апреля 2020

Используя Swift5.2, iOS13.4,

Я пытаюсь анимировать аналоговые часы с секундной, минутной и часовой стрелками.

Полный пример часов можно найти здесь: [Ссылка] (Вот полный пример, который я использую: Пример часов

Все работает - за исключением того, что мой iPhone нагревается из-за низкой эффективности процессора в моих вычислениях углов или angle-animation.

Я обнаружил, что приведенные ниже угловые анимации отвечают за прогрев iPhone.

Как улучшить код, чтобы он был более эффективным с точки зрения использования процессора ?

Вот код вычисления угла:

public struct LocalTime {
    var hour: Double = 10.0
    var minute: Double = 10.0
    var second: Int = 25
}

let translateToRadian: CGFloat = CGFloat(Double.pi/180.0)

В тиковом таймере каждую секунду вычисляется следующее:

secondHand.updateHandAngle(angle: CGFloat(localTime.second * 6) * translateToRadian, duration: 1.0, options: .curveLinear)
minuteHand.updateHandAngle(angle: CGFloat(localTime.minute * 6) * translateToRadian, duration: 0.5, options: .curveEaseInOut)
hourHand.updateHandAngle(angle: CGFloat(localTime.hour * 30) * translateToRadian, duration: 0.5, options: .curveEaseInOut)

Вот метод updateAngle :


func updateHandAngle(angle: CGFloat, duration: Double, options: UIView.AnimationOptions) {
    UIView.animate(withDuration: duration,
                          delay: 0.0,
                        options: options,
                     animations: { self.transform = CGAffineTransform(rotationAngle: angle) },
                     completion: { (finished: Bool) in return }
    )
}

1 Ответ

1 голос
/ 27 апреля 2020

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

В качестве альтернативы, если вы перемещаете минутную стрелку каждую секунду на небольшое количество, любая анимация будет невидимой. (Посмотрите на минутную стрелку механических часов. Они движутся, но вы не можете видеть их движение). Так что вам вообще не понадобится анимация, и подумайте, как часто вы хотите обновлять час.

...