Skip to content
This repository was archived by the owner on May 15, 2025. It is now read-only.

Commit ceca93b

Browse files
authored
Merge pull request #26 from huiping192/feature/preload-video
main thread blockされたときにメモリー使用量急に増えないようにした
2 parents c5fd4ee + 28c0d3c commit ceca93b

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

Sources/Kitsunebi/AnimationView.swift

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
192194
extension 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

Comments
 (0)