From c26fdc30caf8705d6cb7b015ab6cef0444312bc1 Mon Sep 17 00:00:00 2001 From: Yichen <180837074+Cyber-Yichen@users.noreply.github.com> Date: Wed, 15 Jul 2026 01:51:47 +0800 Subject: [PATCH 1/2] Fix long-running saver performance and lifecycle --- Sources/ScreenSaverView.swift | 194 ++++++++++++++++--- Sources/SpritePlayer.swift | 341 ++++++++++++++++++++++++++++++---- 2 files changed, 476 insertions(+), 59 deletions(-) diff --git a/Sources/ScreenSaverView.swift b/Sources/ScreenSaverView.swift index 3e42b21..9d0cdbd 100644 --- a/Sources/ScreenSaverView.swift +++ b/Sources/ScreenSaverView.swift @@ -5,9 +5,20 @@ import ScreenSaver @objc(SnoopyScreenSaverView) final class SnoopyScreenSaverView: ScreenSaverView { + private final class WeakView { + weak var value: SnoopyScreenSaverView? + init(_ value: SnoopyScreenSaverView) { self.value = value } + } + + /// Wallpaper mode may construct a replacement view without reliably + /// stopping the previous one. Keep one live view per display (and one + /// preview) so stale 30 fps animation loops cannot accumulate for days. + private static var activeViews: [String: WeakView] = [:] + private struct ActivePlayback { let container: CALayer let player: AVPlayer + let playerLayer: AVPlayerLayer let scene: AssetRecord let startedAt: Date } @@ -24,21 +35,32 @@ final class SnoopyScreenSaverView: ScreenSaverView { private var watchdog: DispatchWorkItem? private var bootstrapLayer: CALayer? private var preparedIdle: IdleScenePlayback? + private var retiringActives: [ActivePlayback] = [] + private var retiringIdles: [IdleScenePlayback] = [] private var generation = 0 private var lastTransitionPairID: String? private var revealedPlayerID: ObjectIdentifier? + private var sessionActive = false + private var coordinatorKey: String? + private var nextEnvironmentRefresh = Date.distantPast override init?(frame: NSRect, isPreview: Bool) { super.init(frame: frame, isPreview: isPreview); configure() } required init?(coder: NSCoder) { super.init(coder: coder); configure() } + deinit { shutdown() } private func configure() { animationTimeInterval = 1.0 / 30; wantsLayer = true layer?.backgroundColor = NSColor.black.cgColor; layer?.masksToBounds = true } override func startAnimation() { - super.startAnimation(); generation += 1; let expected = generation + guard !sessionActive else { return } + super.startAnimation() + sessionActive = true + claimActiveSlot() + generation += 1; let expected = generation + nextEnvironmentRefresh = Date() showBootstrap() environment.start() if catalog != nil { playInitialScene(); return } @@ -46,7 +68,7 @@ final class SnoopyScreenSaverView: ScreenSaverView { DispatchQueue.global(qos: .userInitiated).async { [weak self] in let result = Result { try AssetCatalog(bundle: bundle) } DispatchQueue.main.async { - guard let self, self.isAnimating, self.generation == expected else { return } + guard let self, self.sessionActive, self.generation == expected else { return } switch result { case .success(let catalog): self.catalog = catalog; self.playInitialScene() case .failure(let error): @@ -54,7 +76,7 @@ final class SnoopyScreenSaverView: ScreenSaverView { // Retry once: ScreenSaverEngine may have raced a freshly // replaced bundle on disk. DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in - guard let self, self.isAnimating, self.generation == expected else { return } + guard let self, self.sessionActive, self.generation == expected else { return } self.startCatalogRetry(bundle: bundle, generation: expected) } } @@ -66,21 +88,40 @@ final class SnoopyScreenSaverView: ScreenSaverView { DispatchQueue.global(qos: .userInitiated).async { [weak self] in let result = try? AssetCatalog(bundle: bundle) DispatchQueue.main.async { - guard let self, self.isAnimating, self.generation == expected, let result else { return } + guard let self, self.sessionActive, self.generation == expected, let result else { return } self.catalog = result; self.playInitialScene() } } } override func stopAnimation() { - generation += 1; removeObservers(); watchdog?.cancel(); watchdog = nil - idle?.stop(); stop(active?.player); preparedIdle?.stop() - idle = nil; active = nil; preparedIdle = nil - environment.stop(); SpriteAssetPlayer.purgeCaches() - layer?.sublayers?.forEach { $0.removeFromSuperlayer() }; bootstrapLayer = nil + shutdown() super.stopAnimation() } - override func animateOneFrame() { idle?.tick(); environment.refreshIfNeeded() } + + override func viewDidMoveToWindow() { + super.viewDidMoveToWindow() + if window != nil, sessionActive { + claimActiveSlot() + } else if window == nil, sessionActive { + // Deferring avoids treating a transient detach/reattach as the end + // of a wallpaper session. + DispatchQueue.main.async { [weak self] in + guard let self, self.window == nil, self.sessionActive else { return } + self.stopAnimation() + } + } + } + + override func animateOneFrame() { + guard sessionActive else { return } + let now = Date() + idle?.tick(now) + if now >= nextEnvironmentRefresh { + nextEnvironmentRefresh = now.addingTimeInterval(60) + environment.refreshIfNeeded() + } + } override func setFrameSize(_ newSize: NSSize) { super.setFrameSize(newSize); bootstrapLayer?.frame = bounds idle?.resize(bounds); active?.container.frame = bounds @@ -94,9 +135,15 @@ final class SnoopyScreenSaverView: ScreenSaverView { @objc func forceNextSceneForTesting() { playActive() } @objc func forceIdleSceneForTesting() { playIdle(durationOverride: 12) } + @objc func forceLongIdleSceneForTesting() { playIdle(durationOverride: 120) } @objc func idleTargetDurationForTesting() -> Double { idle?.targetDuration ?? 0 } @objc func idleCharacterAnimationCountForTesting() -> Int { idle?.specialAnimationCount ?? 0 } @objc func idleHalftonePresentForTesting() -> Bool { idle?.debugHasHalftone ?? false } + @objc func sessionActiveForTesting() -> Bool { sessionActive } + @objc class func activeInstanceCountForTesting() -> Int { + activeViews = activeViews.filter { $0.value.value != nil } + return activeViews.count + } private func playInitialScene() { // Keep the black bootstrap visible until the selected scene is ready, @@ -108,7 +155,7 @@ final class SnoopyScreenSaverView: ScreenSaverView { durationOverride: TimeInterval? = nil, transitionOverride: TransitionChoice? = nil ) { - guard isAnimating, let catalog, let root = layer else { return } + guard sessionActive, let catalog, let root = layer else { return } removeObservers(); watchdog?.cancel(); watchdog = nil let oldActive = active, oldIdle = idle let incoming: IdleScenePlayback @@ -125,11 +172,13 @@ final class SnoopyScreenSaverView: ScreenSaverView { frame: bounds, targetDuration: duration ) } + retainForTransition(oldActive) + retainForTransition(oldIdle) incoming.container.opacity = 0 incoming.container.removeFromSuperlayer() idle = incoming; active = nil; root.addSublayer(incoming.container); incoming.start(); incoming.tick() incoming.onFinished = { [weak self, weak incoming] in - guard let self, let incoming, self.idle === incoming, self.isAnimating else { return } + guard let self, let incoming, self.idle === incoming, self.sessionActive else { return } self.playActive() } let choice: TransitionChoice @@ -147,18 +196,21 @@ final class SnoopyScreenSaverView: ScreenSaverView { style: choice.style, in: bounds ) { [weak self, weak incoming] in guard let self, let incoming, self.idle === incoming else { return } - self.stop(oldActive?.player); oldActive?.container.removeFromSuperlayer() - oldIdle?.stop(); oldIdle?.container.removeFromSuperlayer(); self.bootstrapLayer?.removeFromSuperlayer(); self.bootstrapLayer = nil + self.finishRetiring(oldActive) + self.finishRetiring(oldIdle) + self.bootstrapLayer?.removeFromSuperlayer(); self.bootstrapLayer = nil } } private func playActive() { - guard isAnimating, let catalog, let root = layer else { return } + guard sessionActive, let catalog, let root = layer else { return } removeObservers(); watchdog?.cancel(); watchdog = nil preparedIdle?.stop(); preparedIdle?.container.removeFromSuperlayer(); preparedIdle = nil let outgoingIdle = idle, oldActive = active guard let scene = catalog.selectActive(environment: environment.snapshot(), scorer: scorer), let sprite = scene.sprites.first, let url = sprite.movieURL else { return } + retainForTransition(oldActive) + retainForTransition(outgoingIdle) let item = AVPlayerItem(url: url), player = AVPlayer(playerItem: item) player.isMuted = true; player.volume = 0; player.actionAtItemEnd = .pause let container = CALayer(); container.frame = bounds; container.backgroundColor = NSColor.black.cgColor @@ -168,7 +220,9 @@ final class SnoopyScreenSaverView: ScreenSaverView { // while filling the display, accepting only symmetric edge cropping. // IdleScene uses the metadata-driven aspect-fit viewport instead. video.videoGravity = .resizeAspectFill; container.addSublayer(video); root.addSublayer(container) - let playback = ActivePlayback(container: container, player: player, scene: scene, startedAt: Date()) + let playback = ActivePlayback( + container: container, player: player, playerLayer: video, scene: scene, startedAt: Date() + ) active = playback; revealedPlayerID = nil let isInitialScene = outgoingIdle == nil && oldActive == nil let choice = isInitialScene @@ -194,8 +248,8 @@ final class SnoopyScreenSaverView: ScreenSaverView { style: choice.style, in: self.bounds ) { [weak self, weak player] in guard let self, let player, self.active?.player === player else { return } - self.stop(oldActive?.player); oldActive?.container.removeFromSuperlayer() - outgoingIdle?.stop(); outgoingIdle?.container.removeFromSuperlayer() + self.finishRetiring(oldActive) + self.finishRetiring(outgoingIdle) if let outgoingIdle, self.idle === outgoingIdle { self.idle = nil } self.bootstrapLayer?.removeFromSuperlayer(); self.bootstrapLayer = nil } @@ -258,7 +312,7 @@ final class SnoopyScreenSaverView: ScreenSaverView { } private func prepareIdleForActiveExit() { - guard preparedIdle == nil, let catalog, let root = layer else { return } + guard sessionActive, preparedIdle == nil, let catalog, let root = layer else { return } let duration = Double.random(in: 20...60) guard let composition = catalog.makeIdleComposition( environment: environment.snapshot(), scorer: scorer @@ -280,8 +334,40 @@ final class SnoopyScreenSaverView: ScreenSaverView { endObserver = nil; failureObserver = nil; readiness?.invalidate(); readiness = nil } - private func stop(_ player: AVPlayer?) { - player?.cancelPendingPrerolls(); player?.pause(); player?.replaceCurrentItem(with: nil) + private func stop(_ playback: ActivePlayback?) { + guard let playback else { return } + playback.playerLayer.player = nil + playback.player.cancelPendingPrerolls() + playback.player.pause() + playback.player.replaceCurrentItem(with: nil) + playback.container.removeAllAnimations() + playback.container.removeFromSuperlayer() + } + + private func retainForTransition(_ playback: ActivePlayback?) { + guard let playback, + !retiringActives.contains(where: { $0.player === playback.player }) else { return } + retiringActives.append(playback) + } + + private func retainForTransition(_ playback: IdleScenePlayback?) { + guard let playback, + !retiringIdles.contains(where: { $0 === playback }) else { return } + retiringIdles.append(playback) + } + + private func finishRetiring(_ playback: ActivePlayback?) { + guard let playback else { return } + stop(playback) + retiringActives.removeAll { $0.player === playback.player } + } + + private func finishRetiring(_ playback: IdleScenePlayback?) { + guard let playback else { return } + playback.stop() + playback.container.removeAllAnimations() + playback.container.removeFromSuperlayer() + retiringIdles.removeAll { $0 === playback } } private func showBootstrap() { @@ -290,4 +376,70 @@ final class SnoopyScreenSaverView: ScreenSaverView { let holder = CALayer(); holder.frame = bounds; holder.backgroundColor = NSColor.black.cgColor root.addSublayer(holder); bootstrapLayer = holder } + + private func shutdown() { + guard sessionActive || idle != nil || active != nil || preparedIdle != nil + || !retiringActives.isEmpty || !retiringIdles.isEmpty else { + _ = releaseActiveSlot() + return + } + sessionActive = false + generation += 1 + removeObservers() + watchdog?.cancel(); watchdog = nil + + idle?.stop(); idle?.container.removeAllAnimations(); idle?.container.removeFromSuperlayer() + preparedIdle?.stop(); preparedIdle?.container.removeAllAnimations(); preparedIdle?.container.removeFromSuperlayer() + stop(active) + retiringActives.forEach { stop($0) } + retiringIdles.forEach { + $0.stop(); $0.container.removeAllAnimations(); $0.container.removeFromSuperlayer() + } + retiringActives.removeAll(); retiringIdles.removeAll() + idle = nil; active = nil; preparedIdle = nil + revealedPlayerID = nil + environment.stop() + layer?.sublayers?.forEach { + if let playerLayer = $0 as? AVPlayerLayer { playerLayer.player = nil } + $0.removeAllAnimations() + $0.removeFromSuperlayer() + } + bootstrapLayer = nil + if releaseActiveSlot() { SpriteAssetPlayer.purgeCaches() } + } + + private func claimActiveSlot() { + let key = activationKey() + if let previousKey = coordinatorKey, previousKey != key, + Self.activeViews[previousKey]?.value === self { + Self.activeViews.removeValue(forKey: previousKey) + } + Self.activeViews = Self.activeViews.filter { $0.value.value != nil } + let previous = Self.activeViews[key]?.value + coordinatorKey = key + Self.activeViews[key] = WeakView(self) + if let previous, previous !== self { + NSLog("Snoopy stopping stale screen saver view for %@", key) + previous.stopAnimation() + } + } + + @discardableResult + private func releaseActiveSlot() -> Bool { + if let key = coordinatorKey, Self.activeViews[key]?.value === self { + Self.activeViews.removeValue(forKey: key) + } + coordinatorKey = nil + Self.activeViews = Self.activeViews.filter { $0.value.value != nil } + return Self.activeViews.isEmpty + } + + private func activationKey() -> String { + if isPreview { return "preview" } + let screenNumberKey = NSDeviceDescriptionKey("NSScreenNumber") + if let number = window?.screen?.deviceDescription[screenNumberKey] as? NSNumber { + return "screen-\(number.stringValue)" + } + return "fullscreen" + } } diff --git a/Sources/SpritePlayer.swift b/Sources/SpritePlayer.swift index a0b354e..216d03d 100644 --- a/Sources/SpritePlayer.swift +++ b/Sources/SpritePlayer.swift @@ -3,23 +3,151 @@ import AVFoundation import ImageIO import QuartzCore -private final class FrameCache { - static let shared = FrameCache() - private let cache = NSCache() +/// Decodes HEIC frames away from the Core Animation commit path. `NSImage` +/// keeps its ImageIO source lazy, so merely creating one on the main thread +/// still leaves the expensive HEIF decompression for `CALayer` to perform. +/// The immediate thumbnail below guarantees that layers only ever receive +/// decoded pixels. A bounded shared cache and two workers limit memory and CPU. +private final class FrameDecoder { + private final class Entry { + let image: CGImage + let cost: Int + init(_ image: CGImage) { + self.image = image + cost = image.bytesPerRow * image.height + } + } + + static let shared = FrameDecoder() + + typealias Callback = (CGImage?) -> Void + private final class Request { + var clients: Set = [] + var callbacks: [UUID: [Callback]] = [:] + var operation: BlockOperation? + } + + private let cache = NSCache() + private let queue: OperationQueue + private let lock = NSLock() + private var inFlight: [String: Request] = [:] + private init() { - cache.countLimit = 32 - cache.totalCostLimit = 192 * 1024 * 1024 + cache.countLimit = 64 + cache.totalCostLimit = 256 * 1024 * 1024 + queue = OperationQueue() + queue.name = "local.snoopy.frame-decoder" + queue.qualityOfService = .utility + queue.maxConcurrentOperationCount = 2 } - func image(_ url: URL) -> NSImage? { - let key = url.path as NSString - if let image = cache.object(forKey: key) { return image } - guard let source = CGImageSourceCreateWithURL(url as CFURL, nil), - let cg = CGImageSourceCreateImageAtIndex(source, 0, nil) else { return nil } - let image = NSImage(cgImage: cg, size: .zero) - cache.setObject(image, forKey: key, cost: cg.width * cg.height * 4) - return image + + func key(for url: URL, maxPixelSize: Int) -> String { + "\(url.path)#\(maxPixelSize)" + } + + func cachedImage(for url: URL, maxPixelSize: Int) -> CGImage? { + cache.object(forKey: key(for: url, maxPixelSize: maxPixelSize) as NSString)?.image + } + + func request( + _ url: URL, + maxPixelSize: Int, + clientID: UUID, + completion: Callback? = nil + ) { + let cacheKey = key(for: url, maxPixelSize: maxPixelSize) + if let image = cache.object(forKey: cacheKey as NSString)?.image { + completion?(image) + return + } + + lock.lock() + if let request = inFlight[cacheKey] { + request.clients.insert(clientID) + if let completion { request.callbacks[clientID, default: []].append(completion) } + lock.unlock() + return + } + let request = Request() + request.clients.insert(clientID) + if let completion { request.callbacks[clientID] = [completion] } + let operation = BlockOperation() + request.operation = operation + inFlight[cacheKey] = request + lock.unlock() + + operation.addExecutionBlock { [weak self, weak operation] in + guard let self, operation?.isCancelled == false else { return } + let image = autoreleasepool { + Self.decode(url, maxPixelSize: maxPixelSize) + } + guard operation?.isCancelled == false else { + self.finish(cacheKey, image: nil) + return + } + self.finish(cacheKey, image: image) + } + queue.addOperation(operation) + } + + func cancelRequests(for clientID: UUID) { + lock.lock() + for key in Array(inFlight.keys) { + guard let request = inFlight[key] else { continue } + request.clients.remove(clientID) + request.callbacks.removeValue(forKey: clientID) + if request.clients.isEmpty { + request.operation?.cancel() + inFlight.removeValue(forKey: key) + } + } + lock.unlock() + } + + func removeAll() { + lock.lock() + let operations = inFlight.values.compactMap(\.operation) + inFlight.removeAll() + lock.unlock() + operations.forEach { $0.cancel() } + cache.removeAllObjects() + } + + private func finish(_ cacheKey: String, image: CGImage?) { + lock.lock() + let request = inFlight.removeValue(forKey: cacheKey) + lock.unlock() + guard let request else { return } + if let image { + let entry = Entry(image) + cache.setObject(entry, forKey: cacheKey as NSString, cost: entry.cost) + } + let callbacks = request.callbacks.values.flatMap { $0 } + guard !callbacks.isEmpty else { return } + OperationQueue.main.addOperation { + callbacks.forEach { $0(image) } + } + } + + private static func decode(_ url: URL, maxPixelSize: Int) -> CGImage? { + guard let source = CGImageSourceCreateWithURL( + url as CFURL, + [kCGImageSourceShouldCache: false] as CFDictionary + ) else { return nil } + let options: [CFString: Any] = [ + kCGImageSourceCreateThumbnailFromImageAlways: true, + kCGImageSourceCreateThumbnailWithTransform: true, + kCGImageSourceThumbnailMaxPixelSize: max(64, maxPixelSize), + kCGImageSourceShouldCacheImmediately: true, + ] + guard let sourceImage = CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary) else { + return nil + } + + // `ShouldCacheImmediately` makes this a decoded thumbnail rather than + // the lazy ImageIO-backed image used by the old implementation. + return sourceImage } - func removeAll() { cache.removeAllObjects() } } final class SpriteAssetPlayer { @@ -35,6 +163,12 @@ final class SpriteAssetPlayer { private var frameLayer: CALayer? private var frameDescriptor: SpriteDescriptor? private var frameStarted = Date() + private var frameGeneration = 0 + private var frameReady = false + private var desiredFrameKey: String? + private var pendingFrameKey: String? + private var decoderClientID = UUID() + private var frameURLs: [String: URL] = [:] private(set) var isPlaying = false var debugLayerCount: Int { layers.count } var onReady: (() -> Void)? @@ -45,7 +179,7 @@ final class SpriteAssetPlayer { deinit { stop() } - static func purgeCaches() { FrameCache.shared.removeAll() } + static func purgeCaches() { FrameDecoder.shared.removeAll() } func play( _ asset: AssetRecord, @@ -70,12 +204,11 @@ final class SpriteAssetPlayer { } func tick(_ date: Date = Date()) { - guard let descriptor = frameDescriptor, let layer = frameLayer else { return } + guard frameReady, let descriptor = frameDescriptor, let layer = frameLayer else { return } let elapsed = Int(max(0, date.timeIntervalSince(frameStarted)) * 30) let local = descriptor.loops ? elapsed % descriptor.frameCount : min(descriptor.frameCount - 1, elapsed) - if let url = descriptor.frameURL(descriptor.startFrame + local), let image = FrameCache.shared.image(url) { - layer.contents = image - } + requestFrame(descriptor.startFrame + local, descriptor: descriptor, layer: layer, generation: frameGeneration) + prefetch(descriptor, after: local, count: 6) } func resize() { @@ -87,15 +220,23 @@ final class SpriteAssetPlayer { func stop() { isPlaying = false + FrameDecoder.shared.cancelRequests(for: decoderClientID) + decoderClientID = UUID() + frameGeneration += 1 + frameReady = false + desiredFrameKey = nil + pendingFrameKey = nil + frameURLs.removeAll(keepingCapacity: false) onReady = nil workItems.forEach { $0.cancel() }; workItems.removeAll() observers.forEach(NotificationCenter.default.removeObserver); observers.removeAll() observations.forEach { $0.invalidate() }; observations.removeAll() + layers.compactMap { $0 as? AVPlayerLayer }.forEach { $0.player = nil } players.forEach { $0.cancelPendingPrerolls(); $0.pause(); $0.replaceCurrentItem(with: nil) } players.removeAll() - layers.forEach { $0.removeFromSuperlayer() }; layers.removeAll() + layers.forEach { $0.removeAllAnimations(); $0.removeFromSuperlayer() }; layers.removeAll() layerDescriptors.removeAll() frameLayer = nil; frameDescriptor = nil } @@ -168,22 +309,30 @@ final class SpriteAssetPlayer { return } let layer = CALayer(); layer.contentsGravity = .resizeAspect + layer.opacity = 0 configure(layer, sprite: intro); frameLayer = layer - activateFrame(intro, on: layer); reveal(layer) let introDuration = Double(intro.frameCount) / 30 let outroDuration = Double(outro.frameCount) / 30 let loopDuration = max(Double(loop.frameCount) / 30, targetDuration - introDuration - outroDuration) - schedule(introDuration) { [weak self, weak layer] in + activateFrame(intro, on: layer) { [weak self, weak layer] in guard let self, let layer, self.isPlaying else { return } - // Keep the same CALayer and replace contents only after the first - // incoming frame has decoded. There is no remove/add blank frame. - self.activateFrame(loop, on: layer) - self.schedule(loopDuration) { [weak self, weak layer] in + self.schedule(introDuration) { [weak self, weak layer] in guard let self, let layer, self.isPlaying else { return } - self.activateFrame(outro, on: layer) - self.schedule(outroDuration) { [weak self] in - guard let self, self.isPlaying else { return } - self.isPlaying = false; completion?() + // Keep the same CALayer and retain the previous phase's last + // frame until the first decoded frame of the next phase is + // available. This avoids the one-frame transparent gap. + self.activateFrame(loop, on: layer) { [weak self, weak layer] in + guard let self, let layer, self.isPlaying else { return } + self.schedule(loopDuration) { [weak self, weak layer] in + guard let self, let layer, self.isPlaying else { return } + self.activateFrame(outro, on: layer) { [weak self] in + guard let self, self.isPlaying else { return } + self.schedule(outroDuration) { [weak self] in + guard let self, self.isPlaying else { return } + self.isPlaying = false; completion?() + } + } + } } } } @@ -192,6 +341,7 @@ final class SpriteAssetPlayer { private func playOneShot(_ sprite: SpriteDescriptor, repeatWhole: Bool, completion: (() -> Void)?) { if sprite.mediaType == .frameSequence { let layer = CALayer(); layer.contentsGravity = .resizeAspect + layer.opacity = 0 configure(layer, sprite: sprite); frameLayer = layer var descriptor = sprite if repeatWhole && !sprite.loops { @@ -200,9 +350,14 @@ final class SpriteAssetPlayer { alignment: sprite.alignment, plane: sprite.plane, loops: true, startFrame: sprite.startFrame, endFrame: sprite.endFrame, digitCount: sprite.digitCount) } - activateFrame(descriptor, on: layer); reveal(layer) - if !repeatWhole && !sprite.loops { - schedule(Double(sprite.frameCount) / 30) { [weak self] in self?.isPlaying = false; completion?() } + activateFrame(descriptor, on: layer) { [weak self] in + guard let self, self.isPlaying else { return } + if !repeatWhole && !sprite.loops { + self.schedule(Double(sprite.frameCount) / 30) { [weak self] in + guard let self, self.isPlaying else { return } + self.isPlaying = false; completion?() + } + } } } else if let url = sprite.movieURL { let item = AVPlayerItem(url: url), player = AVPlayer(playerItem: item) @@ -241,13 +396,123 @@ final class SpriteAssetPlayer { CATransaction.commit() onReady?(); onReady = nil } - private func activateFrame(_ descriptor: SpriteDescriptor, on layer: CALayer) { - if let url = descriptor.frameURL(descriptor.startFrame), let image = FrameCache.shared.image(url) { - layer.contents = image - } - frameDescriptor = descriptor; frameStarted = Date() + private func activateFrame( + _ descriptor: SpriteDescriptor, + on layer: CALayer, + completion: (() -> Void)? = nil + ) { + frameGeneration += 1 + let generation = frameGeneration + frameDescriptor = descriptor + frameReady = false + desiredFrameKey = nil + pendingFrameKey = nil layerDescriptors[ObjectIdentifier(layer)] = descriptor layer.frame = ViewportLayout.spriteFrame(descriptor, in: hostBounds(), sceneOffset: sceneOffset) + requestFrame( + descriptor.startFrame, + descriptor: descriptor, + layer: layer, + generation: generation + ) { [weak self, weak layer] in + guard let self, let layer, self.isPlaying, self.frameGeneration == generation else { return } + self.frameReady = true + self.frameStarted = Date() + self.reveal(layer) + completion?() + } + prefetch(descriptor, after: 0, count: 6) + } + + private func requestFrame( + _ frameNumber: Int, + descriptor: SpriteDescriptor, + layer: CALayer, + generation: Int, + firstFrameCompletion: (() -> Void)? = nil + ) { + guard let url = frameURL(frameNumber, descriptor: descriptor) else { return } + let pixelSize = targetPixelSize(for: descriptor) + let key = FrameDecoder.shared.key(for: url, maxPixelSize: pixelSize) + desiredFrameKey = key + + if let image = FrameDecoder.shared.cachedImage(for: url, maxPixelSize: pixelSize) { + installFrame( + image, + key: key, + layer: layer, + generation: generation, + completion: firstFrameCompletion + ) + return + } + guard pendingFrameKey != key else { return } + pendingFrameKey = key + FrameDecoder.shared.request( + url, + maxPixelSize: pixelSize, + clientID: decoderClientID + ) { [weak self, weak layer] image in + guard let self, let layer else { return } + if self.pendingFrameKey == key { self.pendingFrameKey = nil } + guard let image, self.desiredFrameKey == key else { return } + self.installFrame( + image, + key: key, + layer: layer, + generation: generation, + completion: firstFrameCompletion + ) + } + } + + private func installFrame( + _ image: CGImage, + key: String, + layer: CALayer, + generation: Int, + completion: (() -> Void)? + ) { + guard isPlaying, frameGeneration == generation, desiredFrameKey == key, frameLayer === layer else { return } + CATransaction.begin() + CATransaction.setDisableActions(true) + layer.contents = image + CATransaction.commit() + completion?() + } + + private func prefetch(_ descriptor: SpriteDescriptor, after localFrame: Int, count: Int) { + let pixelSize = targetPixelSize(for: descriptor) + for offset in 1...count { + let local: Int + if descriptor.loops { + local = (localFrame + offset) % descriptor.frameCount + } else { + local = min(descriptor.frameCount - 1, localFrame + offset) + } + guard let url = frameURL(descriptor.startFrame + local, descriptor: descriptor) else { continue } + FrameDecoder.shared.request(url, maxPixelSize: pixelSize, clientID: decoderClientID) + if !descriptor.loops && local == descriptor.frameCount - 1 { break } + } + } + + private func targetPixelSize(for descriptor: SpriteDescriptor) -> Int { + let frame = ViewportLayout.spriteFrame(descriptor, in: hostBounds(), sceneOffset: sceneOffset) + // Decode at the logical display size. The line-art assets remain crisp, + // while a 40-frame base-pose loop can stay resident in the bounded + // cache instead of being decompressed again on every repetition. + let longestSide = min(1920, max(frame.width, frame.height)) + // Quantization prevents a resize from generating many nearly identical + // cache variants while still decoding at the current display size. + return max(256, Int(ceil(longestSide / 128)) * 128) + } + + private func frameURL(_ number: Int, descriptor: SpriteDescriptor) -> URL? { + let key = "\(descriptor.baseName)#\(number)" + if let url = frameURLs[key] { return url } + guard let url = descriptor.frameURL(number) else { return nil } + frameURLs[key] = url + return url } private func configure(_ layer: CALayer, sprite: SpriteDescriptor) { layer.frame = ViewportLayout.spriteFrame(sprite, in: hostBounds(), sceneOffset: sceneOffset) From 6187d3ed7c4a2826bdd8c8d32242113b77f055ec Mon Sep 17 00:00:00 2001 From: Yichen <180837074+Cyber-Yichen@users.noreply.github.com> Date: Wed, 15 Jul 2026 01:56:09 +0800 Subject: [PATCH 2/2] Release version 1.1 with new thumbnail --- Assets/thumbnail.png | Bin 7376 -> 14021 bytes Assets/thumbnail@2x.png | Bin 22151 -> 50900 bytes Info.plist | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Assets/thumbnail.png b/Assets/thumbnail.png index 43c671922ea66f5f67cb626930250496bfe0aacf..e8b2c6383917965560e7713cbbcc94095f9acb1e 100644 GIT binary patch delta 13221 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 XwQHIWASr@W00000NkvXXu0mjfRg`ca delta 6523 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 FV1jh6h@}7k delta 21445 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 diff --git a/Info.plist b/Info.plist index 4578673..ba86c9d 100644 --- a/Info.plist +++ b/Info.plist @@ -8,8 +8,8 @@ CFBundleInfoDictionaryVersion6.0 CFBundleNameSnoopy CFBundlePackageTypeBNDL -CFBundleShortVersionString1.0 -CFBundleVersion1 +CFBundleShortVersionString1.1 +CFBundleVersion2 LSMinimumSystemVersion12.0 NSHighResolutionCapable NSPrincipalClassSnoopyScreenSaverView