2017-05-28 25 views
2

入力オーディオデータの波形を描画するアプリケーションを構築しています。ここで波形描画のパフォーマンス最適化

は、それがどのように見えるかを視覚的に表現され:

それはAppleのネイティブ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 

    } 

... 

} 

紫色のバーの最後RECTは、私はAppleのVoiceMemosのように実行し、それを維持するために、波形のcontentOffset.xを増加し始める画面の中央に達するとアプリ。

バーカウントが〜500〜1000に達すると、が表示されます。setContentOffsetの間に目立つ波形の遅れが発生します。

self.inputAudioPlot.setContentOffset(CGPoint(x: CGFloat(self.offset) - CGFloat(self.view.frame.width/2 - 7),y: 0), animated: false)

ここで何を最適化することができますか?どんな助けもありがたい。

+0

サブビューを追加しています_ad infinitum_?もしそうなら、あなたはビューを再利用できるように 'UICollectionView'を使ってこれを実装する必要があります。 –

答えて

1

スーパーレイヤーから画面外にスクロールされるバーを削除するだけです。ファンシーを得たい場合は、新しいサンプルを追加するときにそれらを再利用するためにキューに入れることができますが、これは価値がないかもしれません。

ユーザーがそのビュー内をスクロールさせないようにすると、スクロールビューをまったく使用しないで、新しいバーを追加するときに目に見えるバーを左に移動する価値があります。

もちろん、ユーザーにスクロールさせる必要がある場合は、さらにいくつかの作業が必要です。次に、どこかに表示されているすべての値を保存して戻すことができます。これにより、スクロール中にすべての欠けているバーを追加するためにlayoutSubviewsを上書きすることができます。

これは基本的にはUITableViewUICollectionViewの仕組みなので、コレクションビューとカスタムレイアウトを使用してこれを実装できます。手動で行うのは簡単かもしれませんし、やはり少し上手くやる方がいいかもしれません。

+0

ありがとうございました。 'layoutSubviews'をスクロールしてオーバーライドする際にビューを追加する方法に関する実践的な情報源はありますか?それは私のための謎のようなものです。 –

0

これは恐らくリファクタリングには余裕があると考えられますが、SpriteKitはパフォーマンスの向上と波形のレンダリングの制御を可能にします。

ウェーブバーのSpiteNodes(シェイプノードよりもはるかに高速)を使用できます。これらすべてのスプライトを含む親ノードを移動するだけでスクロールを実装できます。

Spritekitは、レンダリング時に非可視ノードをスキップするのに非常に適しています。また、ノードの数が問題になる場合は、シーンからノードを動的に削除/追加することもできます。

関連する問題