雪碧套件:大量的精灵(1000 +)位Blitting

我试图创build一个SpriteKit有几千个精灵(〜500 – 2000)的场景。 每个精灵只是一个白色的像素1×1 – 没有必要甚至使用他们的纹理。

直接把这个精灵加在一起是不可能的(或者至less我是这么认为的)。 在iPhone 6上,我添加了大约200个精灵,然后由于内存的原因系统结束了添加过程,其余的精灵都没有添加。

我已经find了一个聪明的解决scheme,称为比特Blitting ,其中所有的精灵都添加到一个节点,然后“转换”到textureFromNode:方法的纹理,然后从这个纹理创build一个精灵,最终将被添加到一个屏幕。 它工作的很好,我可以一次创造超过10000个精灵,并具有很高的fps。

我的问题是我以后不能移动这些精灵(=改变位置)。 无论我做什么,纹理总是保持不变。 我错过了什么?

我的代码:

 override func didMoveToView(view: SKView) { self.generateRandomSprites() } func generateRandomSprites() { let texture = SKTexture(imageNamed: "whitePixel") self.canvasNode = SKNode() log("started generating all sprites") for var i = 0;i < 1000;i++ { let width = self.scene!.frame.size.width let height = self.scene!.frame.size.height let x: CGFloat = CGFloat(arc4random_uniform(UInt32(width))) let y: CGFloat = CGFloat(arc4random_uniform(UInt32(height))) let cell = SKSpriteNode(texture: texture) cell.position = CGPointMake(x, y) self.arrCells.append(cell) self.canvasNode.addChild(cell) } self.canvasTexture = self.view!.textureFromNode(self.canvasNode) self.canvasSprite = SKSpriteNode(texture: self.canvasTexture, size: self.frame.size) self.canvasSprite.anchorPoint = ccp(0,0) self.addChild(self.canvasSprite) } override func update(currentTime: CFTimeInterval) { for oneCell in self.arrCells { oneCell.position = CGPointMake(oneCell.position.x + 1, oneCell.position.y) } self.canvasTexture = self.view!.textureFromNode(self.canvasNode) self.canvasSprite.texture = self.canvasTexture } 

从应用截图(这是静态的,没有任何反应):

在这里输入图像说明

这不是答案,而是我尝试过的一些东西。

我真的很好奇这个代码。 我试了一下,但没有奏效。 我改变了更新方法,只是把点在随机的位置,它的工作原理:

所以我有一个问题。 为什么代码只能从当前位置更新,或者是一个红鲱鱼?

 override func update(currentTime: CFTimeInterval) { let width = self.scene!.frame.size.width let height = self.scene!.frame.size.height for oneCell in self.canvasNode.children as! [SKSpriteNode] { let x: CGFloat = CGFloat(arc4random_uniform(UInt32(width))) let y: CGFloat = CGFloat(arc4random_uniform(UInt32(height))) oneCell.position = CGPointMake(x, y) } self.canvasTexture = self.view!.textureFromNode(self.canvasNode) self.canvasSprite.texture = self.canvasTexture } 

好吧,我一直在玩这个更多,这个工程,只是得到一个随机值,并添加到位置…

 override func update(currentTime: CFTimeInterval) { let width = self.scene!.frame.size.width let height = self.scene!.frame.size.height for oneCell in self.canvasNode.children as! [SKSpriteNode] { let x2: CGFloat = CGFloat(arc4random_uniform(UInt32(10))) let y2: CGFloat = CGFloat(arc4random_uniform(UInt32(10))) let x:CGFloat = oneCell.position.x - x2 let y:CGFloat = oneCell.position.y - y2 let point = CGPointMake(x, y) oneCell.position = point } self.canvasTexture = self.view!.textureFromNode(self.canvasNode) self.canvasSprite.texture = self.canvasTexture } 

现在我认为这是编译器的工作原理:

 override func update(currentTime: CFTimeInterval) { let width = self.scene!.frame.size.width let height = self.scene!.frame.size.height var x3:CGFloat = 10.0 var y3:CGFloat = 10.0 for oneCell in self.canvasNode.children as! [SKSpriteNode] { let x:CGFloat = oneCell.position.x - x3 let y:CGFloat = oneCell.position.y - y3 let point = CGPointMake(x, y) oneCell.position = point x3 += 0.01 } self.canvasTexture = self.view!.textureFromNode(self.canvasNode) self.canvasSprite.texture = self.canvasTexture } 

更多的调查,有趣的是,如果您使用值1.3并运行代码,您可以看到点一次移动。 ( http://llvm.org/docs/LangRef.html#simple-constants

 override func update(currentTime: CFTimeInterval) { let width = self.scene!.frame.size.width let height = self.scene!.frame.size.height for oneCell in self.canvasNode.children as! [SKSpriteNode] { let x:CGFloat = oneCell.position.x - 1.3 let y:CGFloat = oneCell.position.y - 1.3 let point = CGPointMake(x, y) oneCell.position = point } self.canvasTexture = self.view!.textureFromNode(self.canvasNode) self.canvasSprite.texture = self.canvasTexture } 

像50.3333333333这样的数字显示可见的震动,但似乎停止。

说实话,我认为你提出的方法不会很好,看起来很复杂。 例如,使用SpriteKit,你可以创build一个具有背景纹理颜色的节点,并将其设置为1×1而不用做任何这样的事情。 喜欢这个:

 SKSpriteNode *node = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(1,1)];