我正在構建一個繪製輸入音頻數據波形的應用程序。波形圖的性能優化
這裏是它的外觀的可視化表示:
其作用類似的方式來蘋果原生應用VoiceMemos。但它缺乏表現。波形本身是一個UIScrollView
子類,其中我繪製CALayer
的實例來表示紫色「條」並將它們添加爲子層。在開始的波形是空的,當聲音輸入開始我更新波形使用此項功能:
class ScrollingWaveformPlot: UIScrollView {
var offset: CGFloat = 0
var normalColor: UIColor?
var waveforms: [CALayer] = []
var lastBarRect: CGRect?
var kBarWidth: Int = 5
func updateGraph(with value: Float) {
//Create instance
self.lastBarRect = CGRect(x: self.offset,
y: self.frame.height/2,
width: CGFloat(self.barWidth),
height: -(CGFloat)(value * 2))
let barLayer = CALayer()
barLayer.bounds = self.lastBarRect!
barLayer.position = CGPoint(x: self.offset + CGFloat(self.barWidth)/2,
y: self.frame.height/2)
barLayer.backgroundColor = self.normalColor?.cgColor
self.layer.addSublayer(barLayer)
self.waveforms.append(barLayer)
self.offset += 7
}
...
}
當紫色欄的最後一個矩形達到屏幕中間我開始增加波形contentOffset.x
以保持其運行像蘋果的VoiceMemos應用程序。
問題是:當條數達到〜500 ... 1000時,一些明顯的波形滯後在setContentOffset
期間開始發生。
self.inputAudioPlot.setContentOffset(CGPoint(x: CGFloat(self.offset) - CGFloat(self.view.frame.width/2 - 7),y: 0), animated: false)
什麼在這裏可以優化?任何幫助讚賞。
您正在添加子視圖_ad infinitum_?如果是這樣,你需要使用'UICollectionView'來實現這個功能,以便重用你的視圖 –