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)
}
}