SKShapeNode消耗过多内存并减慢动画速度 - Spritekit iOS

3

我正在使用SKShapeNode创建类似山的对象。我使用CGMutablePathRef将点给予我的路径。

SKShapeNode *shapenode = [[SKShapeNode alloc] init];

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 0, 0);
......
for (int i = 0; i < [refData count];i++) {


    CGPathAddLineToPoint(path, NULL, ((float)i/[refData count])*screenWidthBoundry,      [[refData objectAtIndex:i] doubleValue]);
}


CGPathAddLineToPoint(path, NULL, screenWidthBoundry, 0);
CGPathAddLineToPoint(path, NULL, 0, 0);

shapenode.path = path;
shapenode.antialiased = YES;
shapenode.fillColor = [SKColor colorWithRed:17.0/255.0 green:108.0/255.0 blue:125.0/255.0 alpha:1.0];
//shapenode.strokeColor = [UIColor clearColor];

shapenode.lineWidth = 1.0f;

shapenode.physicsBody = [SKPhysicsBody bodyWithEdgeChainFromPath:path];

shapenode.physicsBody.affectedByGravity = NO;
shapenode.physicsBody.categoryBitMask = CollisionTypeMountain;
shapenode.physicsBody.collisionBitMask = 0;
shapenode.physicsBody.contactTestBitMask = CollisionTypeBird;

CGPathRelease(path);
return shapenode;

我的问题是SkShapeNode在iPhone 4上减缓了动画速度(在iPad和iPhone 5上运行顺畅,但仍未达到60 fps),同时消耗了大量内存。我能否缓存skshapnode对象以使动画顺畅运行?任何帮助都将不胜感激!


你的形状、大小等等是你的形状节点吗? - sangony
@sangony 这是任意形状...我使用大约200个点绘制了类似山峰的节点。 - Shikha Shah
2
如果您经常重新创建节点,无论是哪个节点,它都会变得很慢。对于SKShapeNode,您需要知道它们不是批量绘制的,它们主要存在于调试目的,而不是为了创建实际的游戏视觉效果。我希望苹果在文档中能更清楚地说明这一点。最后,与下一代iPhone 4S相比,iPhone 4是一种速度较慢的设备。着色器性能显著降低,CPU性能也只有一个核心。让游戏在iPhone 4上运行流畅是当今许多游戏面临的挑战。 - CodeSmile
2个回答

7
我遇到了与 SKShapeNodes 消耗过多的 CPU 资源和降低帧率的相同问题。使用您的 SKView 的 textureFromNode: 方法创建一个 SKTexture。现在,使用您的视图生成的 SKTexture 创建一个 SKSpriteNode。这将解决您的性能问题。 从 SKShapeNode 创建 SKTexture

1
根据您展示的代码,很难判断程序正在发生什么。如果您基于上述方法创建了大量精灵,则内存和性能将会受到影响。建议使用外部图像编辑器(如Fireworks、Photoshop等)创建程序所需的所有形状和图像,并将它们放入纹理集中。使用纹理集将极大地提高性能并减少内存压力。 Apple的Sprite Kit编程指南 特别提到了这个问题:
“如果将每个纹理视为单独的对象,则Sprite Kit和图形硬件必须更加努力地渲染场景-您的游戏性能可能会受到影响。具体来说,Sprite Kit必须对每个纹理进行至少一次绘制处理。为避免进行多次绘制处理,Sprite Kit使用纹理集将相关图像收集在一起。您可以指定要收集在一起的资产,Xcode会自动构建纹理集。然后,当您的游戏加载纹理集时,Sprite Kit将管理纹理集中的所有图像,就好像它们是单个纹理一样。您继续使用SKTexture对象访问纹理集中包含的元素。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接