2016-09-19 12 views
7

私はCATiledLayerに裏打ちされたNSView(MacではiOSではありません)を使用しています。Appleのドキュメントhttps://developer.apple.com/reference/quartzcore/catiledlayerによれば、パフォーマンスを助けるために、しかし、これは主スレッドで呼び出されるようにしか見えません。私はNSViewの上canDrawConcurrentlyを有効にしているdrawLayer(layer: CALayer, inContext ctx: CGContext)CATiledLayer drawLayer:メインスレッドで常に呼び出されているinContext

で仕事をしているだけでなく、窓を確保しています

allowsConcurrentViewDrawingは真(デフォルト)に設定し、それはまだ、常に各タイルのメインスレッド上で呼び出していますrect。

ディスプレイを必要とする矩形領域に依存して表示する前に、いくつかの画像操作を行う必要があり、メインスレッドで実行するとパフォーマンスに影響します。

どのようにしてバックグラウンドスレッドで呼び出すことができますか?

私は、バックグラウンドスレッドへの操作イメージを整列化し、次でメインキューを思い出しますが、それは空白の矩形表示しようとしている。だからここ

backgroundQueue.addOperationWithBlock({ [ weak self ] in    
    guard let strongSelf = self else { return } 

    // ** This is the part I nee to do in background that can take some time 
    guard let image = strongSelf.imageForTileRect(layerBounds, imageSize: imageSize) else { return } 
    // ** End background bit 

    var rect = layerBounds 
    let rectImageRef = image.CGImageForProposedRect(&rect, context: nil, hints: nil) 

    if (rectImageRef != nil) { 
     NSOperationQueue.mainQueue().addOperationWithBlock({ 
      CGContextDrawImage(ctx, rect, rectImageRef) 
     }) 
    } 
}) 
+0

あなたはこのことを理解しました...それは働いていた気づきましたか?私は同じことを見ている。バックグラウンドスレッドを使用してNSViewのCATiledLayerに描画します。 –

+0

ここにいくつかの文脈があります。背中合わせのオーバーレイにオーバーレイとして別のCATiledLayerを追加すると、バックグラウンドでレンダリングされます。私のビューのバッキングである主要なものだけがメインスレッド上にレンダリングされます。私はメインのものを空白にしてしまい、私のレンダリングをオーバーレイCATiledLayerに入れます。 –

答えて

0

は、私はそれはそれが、働いている何をしたかであります理想的ではありません。 drawRect:私のCATiledLayerに裏付けされたNSView私は単純な背景(私の場合は単純なグリッド)を描きます。別のCATiledLayerを作成し、NSViewのレイヤーをサブレイヤーとして追加し、NSViewをそのデリゲートとして設定しました。この2番目の `CATiledLayer 'は、バックグラウンドスレッドでデリゲート描画呼び出しを取得しています。

1

CATiledLayerがプライマリレイヤーのときに実際には動作しませんでしたが、なぜ動作しないのか分かりません。アップルのバグから答えが得られませんでした。

しかし、プライマリレイヤを標準のCALayerにしてから、このプライマリレイヤにサブレイヤーとしてCATiledLayerを追加することで、バックグラウンドレンダリングを行うことができました。このことができますNSViewの

ホープCATiledLayerをホスティングしている場合に予想されるよう

は、我々はまた、

class HostingLayer : CALayer { 

    var tiledLayer : CATiledLayer! 

    override init() { 
     super.init() 

     self.tiledLayer = CATiledLayer.init() 

     self.addSublayer(tiledLayer!) 
    } 
} 
関連する問題