2016-11-21 4 views
1

Я написал функцию рендеринга, которая вызывается каждые 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 
} 
+0

'в то время как верно {печать («петля»}' должен быть быстрым, это только одна строка, верно? – Alexander

+0

, вероятно, следует использовать scenekit/GameKit или OpenGL, чтобы сделать это, я не думаю, что UIGraphicsImageRenderer был разработан для использования в таким образом – Fonix

+0

Вы вызываете 'cos' 2400 раз в секунду и' sin' 3600 раз в секунду, а также выполняете не менее 16800 умножений в секунду всего внутри цикла 'for'. – rmaddy

ответ

1

Я думаю, что apptoach не очень хорошо. Если вы хотите отображать анимированный контент, вы не должны перерисовывать виды. Вы должны использовать CoreAnimation. Хорошая новость - его легко реализовать. Плохая новость заключается в том, что нужно немного научиться. ;)

Некоторые предложения в вашем коде:

  1. Некоторые части вашего рисунка, кажется, постоянным. Таким образом, он не мог повторять это снова и снова. Вместо этого вы можете поместить его в отдельный слой.
  2. Как @rmaddy предлагает вам множество вычислений sin и cos. Но эти значения всегда должны быть одинаковыми. Поэтому вы можете вычислить их один раз и кэшировать их.
  3. Вы можете реализовать чертеж внутри в draw(in:) и использовать динамические свойства для всех переменных частей кода. Вы можете использовать анимации из CoreAnimation, чтобы анимировать рисунок. Создание динамических свойств CA в Swift является сложным. (Насколько я знаю, вы должны аннотировать их @NSManaged (!), И вы должны перезаписать needsDisplay(forKey:) и вернуть true для них.).

 Смежные вопросы

  • Нет связанных вопросов^_^