好的,所以标题让这看起来很简单,但问题就在这里。这些对象仅通过下面的循环进行操作,并删除
[SKAction removeFromParent];
然后解决问题,只有对象仍然存在,因为我可以看到内存消耗随着时间的推移而增长,然后降低帧速率并且增加CPU。
我不知道为什么会导致内存访问异常。提前谢谢。
for (int i=0;i<30; i++) {
SKSpriteNode *particle = [SKSpriteNode spriteNodeWithColor:[SKColor purpleColor] size:CGSizeMake(3, 3)];
particle.zPosition = 0;
particle.position = position; // passed in through method call
[self addChild:particle];
SKAction *move = [SKAction moveByX:ScalarRandomRange(-25, 25) y:ScalarRandomRange(-25, 25) duration:0.1];
SKAction *fadeOut = [SKAction fadeOutWithDuration:0.5];
[particle runAction:[SKAction sequence:@[move,fadeOut]] withKey:@"explosion"];
}
以下是电话会议地点的截图 - 发生问题的堆栈。
我在更新方法中添加了以下代码
-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
NSMutableArray *killList = [[NSMutableArray alloc]init];
for (SKNode *node in [self children]) {
if ([node.name isEqualToString:@"particle"]) {
if (!([node actionForKey:@"explosion"])) {
[killList addObject:node];
}
}
}
for (SKNode *node in killList) {
[node removeFromParent];
}
}
它似乎修复了异常问题,但我仍然注意到内存略有上升,我需要在仪器中进行调查。
这似乎是解决问题的一种黑客方式,因为我应该能够使用
[SKAction removeFromParent];
在我的序列中。
答案 0 :(得分:0)
我知道你想在调用removeFromAction方法之前检查你的节点是否仍然存在,这可以是一个解决方案:
particle.name = @"particle";
[particle runAction:[SKAction sequence:@[move, fadeOut, ([self childNodeWithName:@"particle"]?[SKAction removeFromParent]:nil)]]];
(我同意LearnCocos2D,除了removeFromAction之外,问题可能有不同的原因)