Ich baue eine App, die die Wellenform von Audio-Eingangsdaten zeichnen.Leistungsoptimierung der Wellenform Zeichnung
Hier ist eine visuelle Darstellung, wie es aussieht:
Es Apples nativen VoiceMemos App in ähnlicher Weise verhält. Aber es fehlt die Leistung. Die Wellenform selbst ist eine UIScrollView
Unterklasse, in der ich Instanzen von CALayer
zeichne, um violette "Balken" darzustellen und sie als Unterschichten hinzuzufügen. Am Anfang Wellenform leer ist, wenn Toneingang beginnt ich Update-Wellenform mit dieser Funktion:
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
}
...
}
Als letzter rect von lila Balken in die Mitte des Bildschirms erreicht beginne ich contentOffset.x
der Wellenform zu erhöhen, damit es läuft wie Apples VoiceMemos App
Das Problem ist:, wenn die Anzahl der Balken erreicht ~ 500 ... 1000 einige bemerkenswerte Verzögerung der Wellenform beginnt während setContentOffset
passieren.
self.inputAudioPlot.setContentOffset(CGPoint(x: CGFloat(self.offset) - CGFloat(self.view.frame.width/2 - 7),y: 0), animated: false)
Was hier optimiert werden können? Jede Hilfe wird geschätzt.
Sie fügen Subviews _ad infinitum_ hinzu? Wenn ja, müssen Sie dies mit 'UICollectionView' implementieren, damit Ihre Ansichten wiederverwendet werden. –