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 对象以顺利运行动画吗?任何帮助表示赞赏!

4

2 回答 2

7

我遇到了同样的问题,SKShapeNodes 消耗了太多的 CPU 资源并杀死了帧率。使用您的 SKView 的textureFromNode:方法创建一个 SKTexture。现在使用您的视图生成的 SKTexture 创建一个 SKSpriteNode。这将解决您的性能问题。

从 SKShapeNode 创建 SKTexture

于 2014-05-25T22:57:18.970 回答
1

仅根据您显示的代码,很难判断程序中发生了什么。如果您基于上述方法创建大量精灵,那么内存和性能将会受到影响。

考虑使用外部图像编辑器(如 Fireworks、Photoshop 等)创建程序所需的所有形状和图像……并将它们放入纹理图集中。使用图集将大大提高性能并减少内存压力。

Apple 的 Sprite Kit 编程指南特别提到了这个问题:

如果每个纹理都被视为一个单独的对象,那么 Sprite Kit 和图形硬件必须更加努力地渲染场景——您的游戏性能可能会受到影响。具体来说,Sprite Kit 必须对每个纹理至少进行一次绘制。为了避免进行多次绘制,Sprite Kit 使用纹理图集将相关图像收集在一起。您指定应该一起收集哪些资产,Xcode 会自动构建纹理图集。然后,当您的游戏加载纹理图集时,Sprite Kit 会管理图集中的所有图像,就好像它们是单个纹理一样。您继续使用 SKTexture 对象来访问图集中包含的元素。

于 2014-04-28T23:12:35.250 回答