@@ -18,7 +18,8 @@ open class PlayerView: UIView {
1818 override open class var layerClass : Swift . AnyClass {
1919 return CAMetalLayer . self
2020 }
21- private var gpuLayer : LayerClass { self . layer as! LayerClass }
21+ // self.layer main thread使う必要あるので、事前に持つことでmain thread以外のthreadでも使えるように
22+ private lazy var gpuLayer : LayerClass = { fatalError ( " gpuLayer must be init " ) } ( )
2223 private let renderQueue : DispatchQueue = . global( qos: . userInitiated)
2324 private let commandQueue : MTLCommandQueue
2425 private let textureCache : CVMetalTextureCache
@@ -60,6 +61,8 @@ open class PlayerView: UIView {
6061 super. init ( frame: frame)
6162 applicationHandler. delegate = self
6263 backgroundColor = . clear
64+
65+ gpuLayer = self . layer as! LayerClass
6366 gpuLayer. isOpaque = false
6467 gpuLayer. drawsAsynchronously = true
6568 gpuLayer. contentsGravity = . resizeAspectFill
@@ -84,6 +87,8 @@ open class PlayerView: UIView {
8487 super. init ( coder: aDecoder)
8588 applicationHandler. delegate = self
8689 backgroundColor = . clear
90+
91+ gpuLayer = self . layer as! LayerClass
8792 gpuLayer. isOpaque = false
8893 gpuLayer. drawsAsynchronously = true
8994 gpuLayer. contentsGravity = . resizeAspectFill
@@ -122,12 +127,9 @@ open class PlayerView: UIView {
122127 }
123128
124129 private func clear( ) {
125- DispatchQueue . main. async { [ weak self] in
126- /// `gpuLayer` must access within main-thread.
130+ renderQueue. async { [ weak self] in
127131 guard let nextDrawable = self ? . gpuLayer. nextDrawable ( ) else { return }
128- self ? . renderQueue. async { [ weak self] in
129- self ? . clear ( nextDrawable: nextDrawable)
130- }
132+ self ? . clear ( nextDrawable: nextDrawable)
131133 }
132134 }
133135
@@ -192,16 +194,14 @@ open class PlayerView: UIView {
192194extension PlayerView : VideoEngineUpdateDelegate {
193195 internal func didOutputFrame( _ frame: Frame ) {
194196 guard applicationHandler. isActive else { return }
195- DispatchQueue . main. async { [ weak self] in
196- /// `gpuLayer` must access within main-thread.
197- guard let nextDrawable = self ? . gpuLayer. nextDrawable ( ) else { return }
198- self ? . gpuLayer. drawableSize = frame. size
199- self ? . renderQueue. async { [ weak self] in
200- do {
201- try self ? . renderImage ( with: frame, to: nextDrawable)
202- } catch {
203- self ? . clear ( nextDrawable: nextDrawable)
204- }
197+
198+ renderQueue. async { [ weak self] in
199+ guard let self = self , let nextDrawable = self . gpuLayer. nextDrawable ( ) else { return }
200+ self . gpuLayer. drawableSize = frame. size
201+ do {
202+ try self . renderImage ( with: frame, to: nextDrawable)
203+ } catch {
204+ self . clear ( nextDrawable: nextDrawable)
205205 }
206206 }
207207 }
0 commit comments