Существует ряд стратегий, которые вы можете попытаться оптимизировать, используя код для рисования, но для меня наиболее очевидным является то, что вы должны предварительно рассчитать необходимые CGRect вне кода для рисования.
Для запускаемых вами циклов требуется * итераций каждого кадра анимации для расчета всех необходимых CGRect. Это много и совершенно не нужно, потому что CGRect всегда будут одинаковыми, если ширина и высота неизменны. Вместо этого вы должны сделать что-то вроде этого:
var cachedRects = [CGRect]()
override var frame: CGRect {
didSet {
calculateRects()
}
}
func calculateRects() {
cachedRects = []
let w = frame.width
let h = frame.height
for i in 0...Int(w-1) {
for j in 0...Int(h-1) {
let rect = CGRect(x: i, y: j, width: 1, height: 1)
cachedRects += [rect]
}
}
}
override func draw(_ rect: CGRect) {
super.draw(rect)
let context = UIGraphicsGetCurrentContext()!
var val: CGFloat!
var color: UIColor!
for rect in cachedRects {
val = .random
color = UIColor(red: val, green: val, blue: val, alpha: 1.0)
context.setFillColor(color.cgColor)
context.fill(rect)
}
context.flush()
}
Предварительно кешируя тезисы, вам нужно всего лишь сделать (w * h) количество итераций, что является огромным улучшением.
Если этого недостаточно для повышения производительности, вы можете дополнительно оптимизировать, используя аналогичные стратегии предварительного кэширования, например, вместо того, чтобы рандомизировать каждый пиксель, предварительно рассчитать листы случайных цветов вне кода прорисовки и затем случайным образом собрать их в drawRect()
. Если проблема с производительностью связана с рандомизатором, это приведет к сокращению объема работы.
Ключевая стратегия состоит в том, чтобы попытаться минимизировать объем работы, которую должен выполнять ваш метод drawRect()
, поскольку он выполняется в каждом кадре анимации.
Удачи!