Title: SpriteKit FPS drops significantly on iOS 26.3.1 when touching screen, even in a minimal scene
Summary: On a real device running iOS 26.3.1, FPS drops significantly in a very simple SpriteKit scene when touching or moving a finger on the screen. This happens even with a minimal setup where update(_:), touchesBegan, and touchesMoved are not overridden. Because the issue reproduces in a minimal scene, I suspect a performance regression in SpriteKit and/or iOS rather than in app-specific logic.
Environment:
- OS: iOS 26.3.1
- Device: iPhone 12
- Xcode: 26.3
- Build Configuration: Release
- Framework: SpriteKit
- FPS measurement: SKView.showsFPS = true
Steps to Reproduce:
- Present a minimal SpriteKit scene.
- Enable SKView.showsFPS = true.
- Add only a very small number of nodes to the scene.
- Do not override update(_:), touchesBegan, or touchesMoved.
- Repeatedly tap the screen or move a finger around.
Actual Result:
- The scene stays around 60 FPS when idle.
- FPS drops significantly when touching or moving a finger on the screen.
- The drop appears to get worse as the node count increases.
- The issue still reproduces even if touchesMoved is empty or not overridden at all.
Expected Result:
- A minimal scene like this should remain close to 60 FPS even while touching the screen.
- At minimum, FPS should not drop this much when the app does not perform meaningful touch handling.
Notes:
- Time Profiler does not point to a clear heavy app-specific function; instead, frame time worsens during touch interaction.
- Since this also reproduces in a minimal scene, I do not believe the root cause is only in my game logic.
- Similar reports exist describing SpriteKit framerate drops on recent iOS versions, including cases where the issue appears in very simple scenes.
Minimal Reproducible Code:
import SpriteKit
final class TestScene: SKScene {
override func didMove(to view: SKView) {
backgroundColor = .black
scaleMode = .resizeFill
let textures = [
SKTexture(imageNamed: "title1"),
SKTexture(imageNamed: "title2"),
SKTexture(imageNamed: "title3"),
SKTexture(imageNamed: "title4"),
SKTexture(imageNamed: "title5"),
]
let node = SKSpriteNode(texture: textures[0])
node.position = CGPoint(x: size.width * 0.5, y: size.height * 0.5)
addChild(node)
let anim = SKAction.animate(
with: textures,
timePerFrame: 8.0 / 60.0,
resize: false,
restore: false
)
node.run(.repeatForever(anim))
}
}
import UIKit
import SpriteKit
final class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let skView = SKView(frame: view.bounds)
skView.showsFPS = true
skView.showsNodeCount = true
skView.ignoresSiblingOrder = true
skView.preferredFrameRate = 60
view.addSubview(skView)
let scene = TestScene(size: skView.bounds.size)
skView.presentScene(scene)
}
}
Thanks for the detailed repro — this is a well-structured report and the minimal scene makes it straightforward to investigate.
One diagnostic step that would help narrow this down: try setting isUserInteractionEnabled = false on both the scene and the sprite node, then test again. If the FPS drop goes away during touch interaction, that confirms the bottleneck is in SpriteKit's internal touch processing and hit-testing path rather than in rendering. This isn't a practical workaround for a game that needs touch input, but it isolates the cause.
For profiling, the Game Performance or Animation Hitches template in Instruments will give you more useful frame-level timing data than Time Profiler alone. Capturing a trace during touch interaction and attaching it to the report below would strengthen the diagnosis.
Please file a feedback report through Feedback Assistant with your minimal repro project and any Instruments traces you capture, and post the feedback number here so we can track it.