使用Xcode自带的sprite kit模板,我修改场景如下:
#import "MyScene.h"
@interface MyScene ()
@property (nonatomic,strong)SKNode *floor;
@end
@implementation MyScene
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
/* Setup your scene here */
}
return self;
}
-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
[self removeAllChildren];
self.floor = nil;
self.floor = [SKNode node];
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, nil, 0, 10);
for(int i = 2; i<self.frame.size.width; i+=2)
{
CGPathAddLineToPoint(path, nil, i, 10);
}
self.floor.physicsBody = [SKPhysicsBody bodyWithEdgeChainFromPath:path];
SKShapeNode *shape = [SKShapeNode node];
shape.path = path;
shape.strokeColor = [UIColor redColor];
[self.floor addChild:shape];
[self addChild:self.floor];
CGPathRelease(path);
}
@end
该应用程序似乎一直在使用更多内存,直到它挂起或崩溃(达到约 180MB 后)。使用泄漏和分配工具,我发现了以下内容:
泄漏: 分配:
从图片中可以看出,有大量的Malloc调用占用内存。我没有直接调用 Malloc——这些调用似乎是由 SpriteKit 发出的。同样,也有一些内存泄漏,这似乎也是由于 SKShapeNode、SKNode 或其他 Sprite Kit 对象造成的。
我该如何变通或解决这个内存(泄漏)问题?我必须创建 SKShapeNodes 和每帧 SKNodes。此代码只是说明问题的示例 - 我的实际项目要复杂得多,具有动态生成的路径(不像本例中的那样是静态的)。
最佳答案
这是 sprite 工具包中的错误。问题不仅在于 SKShapeNode,还在于 SKPhysicsBody。
使用 CGPath 创建物理体或形状会导致内存泄漏。 您可以通过注释掉物理体或形状并运行带有泄漏、分配和内存监视器的仪器来验证这一点。
即使您正确释放路径,sprite kit 内部也不会。你无能为力!
启动仪器,观察内存增长! XD
编辑:这个错误出现在 iOS 7.0 中。我不知道它是否已在 7.1 或更高版本中修复,因为这个错误我停止使用 SpriteKit。可以通过简单的测试来验证它是否已修复。
关于ios - 为什么重复创建和删除SKShapeNode和SKNode会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292318/