SpriteKit: SKSpriteNodes исчезает из SKEffectNode через несколько секунд

Я работаю над эффектом метабаллов в SpriteKit. У меня есть SKEffectNode с шейдером, который сжимает диапазон цвета его буфера. Этот effectnode имеет в своем дочернем SKSpriteNode сотню нечетных символов. Эффект отлично работает на пару секунд, но внезапно, в течение нескольких кадров, все спритоноды исчезают с экрана, а узловая ступень падает с 100-секундного вниз до 2 (я думаю, оставшиеся 2 являются эффектом сам и краевая цепь, которая образует контейнер для удержания шаров?)

Если я добавлю шариковые spritenodes непосредственно в корневой каталог сцены, этого не произойдет. Это происходит только тогда, когда они становятся детьми из эффектного состояния, что они кажутся агрессивно отбракованными через несколько секунд.

Интересно, что (и это видно в симуляторе, если частота кадров довольно низкая), SpriteNodes, похоже, отбираются в вертикальном порядке, который они отображаются в настоящее время на экране, от верхней части экрана до нижней.

Если свойство showsPhysics значение true, я вижу, что физические тела SKSpriteNode все еще присутствуют на экране и катятся. Но их визуальное представление исчезло, и количество узлов обзора было исчерпано. Согласно документам showsNodeCount «показывает физические тела, которые видны на сцене». Так как узлы больше не видны, количество узлов упало.

Кто-нибудь знает, что может быть причиной этого, или какие инструменты я могу использовать для его отладки?

Стандартный шаблон SpriteKit iOS Swift 2.2 Xcode 7, замените файл GameScene следующим:

 import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { // create walls to contain balls let box = SKPhysicsBody(edgeLoopFromRect: CGRect(x: 0, y: 0, width: 800, height: 800)) let boxNode = SKNode() boxNode.physicsBody = box addChild(boxNode) let radius: CGFloat = 5 let texture = createMetaballTexture(radius) let centre = CGPoint(x: frame.size.width / 2, y: frame.size.height / 2) let rows = 12 let columns = 10 let metaballs = SKEffectNode() let shaderString = [ "void main()", "{", "vec4 c = texture2D(u_texture, v_tex_coord);", "gl_FragColor = smoothstep(0.3, 0.6, c); ", "}"].joinWithSeparator("\n") let map = SKShader(source: shaderString) metaballs.shader = map for i in 0...(rows * columns) { let ball = SKSpriteNode(texture: texture) let body = SKPhysicsBody(circleOfRadius: radius) body.friction = 0.1 body.restitution = 0.8 ball.physicsBody = body ball.position = CGPoint(x: centre.x + CGFloat(i % columns) * radius, y: centre.y + CGFloat(i / rows) * radius) ball.blendMode = .Add metaballs.addChild(ball) // change this to "addChild(ball)", and the nodes don't get culled } addChild(metaballs) physicsWorld.speed = 0.2 backgroundColor = SKColor.darkGrayColor() } func createMetaballTexture(radius: CGFloat) -> SKTexture { let metaballScale: CGFloat = 8 let ellipseOrigin = (metaballScale / 2) - 1.5 UIGraphicsBeginImageContext(CGSize(width: radius * metaballScale, height: radius * metaballScale)) let context = UIGraphicsGetCurrentContext() SKColor.whiteColor().setFill() CGContextFillEllipseInRect(context, CGRect(x: radius * ellipseOrigin, y: radius * ellipseOrigin, width: radius * 3, height: radius * 3)) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return SKTexture(CGImage: blur(image!)) } } func blur(image: UIImage) -> CGImage { let gaussianBlurFilter = CIFilter(name: "CIGaussianBlur") let inputImage = CIImage(CGImage: image.CGImage!) gaussianBlurFilter?.setValue(inputImage, forKey:kCIInputImageKey) gaussianBlurFilter?.setValue(5, forKey: kCIInputRadiusKey) let outputImage = gaussianBlurFilter?.outputImage let context = CIContext(options: nil) return context.createCGImage(outputImage!, fromRect: inputImage.extent) } 

Давайте будем гением компьютера.