私は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)
})
}
})
あなたはこのことを理解しました...それは働いていた気づきましたか?私は同じことを見ている。バックグラウンドスレッドを使用してNSViewのCATiledLayerに描画します。 –
ここにいくつかの文脈があります。背中合わせのオーバーレイにオーバーレイとして別のCATiledLayerを追加すると、バックグラウンドでレンダリングされます。私のビューのバッキングである主要なものだけがメインスレッド上にレンダリングされます。私はメインのものを空白にしてしまい、私のレンダリングをオーバーレイCATiledLayerに入れます。 –