我目前正在使用SpriteKit和Objective-C开发iOS游戏。我最近一直试图优化我的绘制调用,但我遇到了一个问题,我要么误解了批量绘制操作和/或我收到了一些意想不到的结果。另外我已经阅读了关于批量绘图的Apple文档,我只是害怕我可能误解了一些指南。
所以这是破旧:(假设所有地图集都是预加载的,而且自我是SKScene)
这可以像您期望的那样工作。第一次触摸为节点和绘制计数添加+1。后续触摸会添加节点计数,但不会添加绘制计数。
/*Code Block 1:*/
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];
SKSpriteNode *touch1 = [SKSpriteNode spriteNodeWithTexture:[[SKTextureAtlas atlasNamed:@"TouchAtlas1"] textureNamed:@"texture1"]];
[touch1 setPosition:location];
[self addChild:enemyTouch];
}
当我开始将来自不同地图集的两个精灵添加到父亲时,我开始得到太多的绘制调用。我的期望:在第一次触摸时,我将获得+2个节点和+2个绘制调用以及随后的触摸产生+2个节点和+0个绘制调用。我得到了:在第一次触摸时我得到了+2个节点和+2个绘制调用以及随后的触摸产生了+2个节点和+2个绘制调用。
/*Code Block 2:*/
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];
SKSpriteNode *touch1 = [SKSpriteNode spriteNodeWithTexture:[[SKTextureAtlas atlasNamed:@"TouchAtlas1"] textureNamed:@"texture1"]];
[touch1 setPosition:location];
[self addChild:touch1];
SKSpriteNode *touch2 = [SKSpriteNode spriteNodeWithTexture:[[SKTextureAtlas atlasNamed:@"TouchAtlas2"] textureNamed:@"texture2"]];
[touch2 setPosition:location];
[self addChild:touch2];
}
我尝试了另外一个步骤:将一个子SKNode * extraLayer添加到场景中,并向场景添加一个精灵,并向extraLayer添加一个精灵。这产生了我想要的+2节点和+0绘制调用的期望结果。
/*Code Block 3:*/
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];
SKSpriteNode *touch1 = [SKSpriteNode spriteNodeWithTexture:[[SKTextureAtlas atlasNamed:@"TouchAtlas1"] textureNamed:@"texture1"]];
[touch1 setPosition:location];
[self addChild:touch1];
SKSpriteNode *touch2 = [SKSpriteNode spriteNodeWithTexture:[[SKTextureAtlas atlasNamed:@"TouchAtlas2"] textureNamed:@"texture2"]];
[touch2 setPosition:location];
[self.extraLayer addChild:touch2];
}
问题:这实际上是否需要处理批量绘制调用的方式?所有精灵的纹理来自普通的地图集需要是同一个父母的孩子,但另外父母没有孩子的纹理来自不同的地图集?或者有没有一种方法可以正确地批量生成块2的方法?