Я написал функцию рендеринга, которая вызывается каждые 1/60 секунды. Это показано ниже. По существу, он отображает 40 линий в радиальном шаблоне, который использует синус. Похоже, это http://imgur.com/a/kPKtT. Когда я запускаю его на своем iPhone 6s с отладчиком, он показывает, что он использует около 60% процессора, и он просто делает «высокий» уровень использования батареи. Мне это не кажется правильным, это всего лишь 40 простых строк?iOS CGContext Плохая производительность
Могу ли я сделать это более эффективно? Должен ли я пытаться использовать что-то другое, например CALayer или Metal, для лучшей производительности? Я, кстати, кстати.
func render() { tick += 0.01
let renderer = UIGraphicsImageRenderer(size: CGSize(width: 375, height: 667))
let img = renderer.image { ctx in
let c = ctx.cgContext
// Set background
let background = CGRect(x: 0, y: 0, width: 375, height: 667)
c.setFillColor(UIColor.black.cgColor)
c.addRect(background)
c.drawPath(using: .fillStroke)
// Function to draw a line
func line(p1:CGPoint, p2:CGPoint) {
let line = CGRect(x: 0, y: 0, width: 200, height: 200)
c.addLines(between: [p1,p2])
c.drawPath(using: .fillStroke)
}
// Draw lines
c.setStrokeColor(UIColor.white.cgColor)
c.setLineWidth(1)
c.setLineCap(CGLineCap.round)
for i in 0...39 {
let n:CGFloat = CGFloat(i) * CGFloat.pi/40
let d:CGFloat = sin(tick + CGFloat(i)*CGFloat.pi/5)*20 + 100
line(p1: CGPoint(x: d*cos(tick+n)+187.5, y: d*sin(tick+n)+333.5),
p2: CGPoint(x: d*cos(tick+n+CGFloat.pi)+187.5, y: d*sin(tick+n+CGFloat.pi)+333.5))
}
}
imageView.image = img
}
'в то время как верно {печать («петля»}' должен быть быстрым, это только одна строка, верно? – Alexander
, вероятно, следует использовать scenekit/GameKit или OpenGL, чтобы сделать это, я не думаю, что UIGraphicsImageRenderer был разработан для использования в таким образом – Fonix
Вы вызываете 'cos' 2400 раз в секунду и' sin' 3600 раз в секунду, а также выполняете не менее 16800 умножений в секунду всего внутри цикла 'for'. – rmaddy