SKShapeNode消耗太多内存并减慢动画-Spritekit iOS
我正在使用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对象以顺利运行动画吗? 任何帮助表示赞赏!!
我遇到了同样的问题,SKShapeNodes消耗了太多的CPU资源并且杀死了帧速率。 使用SKView的textureFromNode:
方法创建SKTexture。 现在创建一个SKSpriteNode,其中包含生成视图的SKTexture。 这将解决您的性能问题。
从SKShapeNode创建SKTexture
根据您显示的代码,很难分辨您程序中发生了什么。 如果你基于上面的方法创建了很多精灵,那么内存和性能将受到影响。
考虑使用外部图像编辑器(如Fireworks,Photoshop等)创建程序所需的所有形状和图像,并将它们放入纹理图集中。 使用地图集将大大提高性能并降低内存压力。
Apple的Sprite Kit编程指南特别提到了这个问题:
如果将每个纹理视为一个单独的对象,那么Sprite Kit和图形硬件必须更加努力地渲染场景 – 并且您的游戏性能可能会受到影响。 具体来说,Sprite Kit必须为每个纹理至少进行一次绘图。 为避免进行多次绘图,Sprite Kit使用纹理图集将相关图像收集在一起。 您可以指定应该一起收集哪些资产,Xcode会自动构建纹理图集。 然后,当您的游戏加载纹理图集时,Sprite Kit会管理图集中的所有图像,就好像它们是单个纹理一样。 您继续使用SKTexture对象来访问图集中包含的元素。