Iva*_*sko 8 objective-c ios sprite-kit
有没有办法从SKShapeNode创建SKTexture?已知形状节点会导致内存问题,我正在寻找一种从它们创建静态图形的方法(最好是.png).
pro*_*cal 12
您可以使用SKView调用的方法textureFromNode:
这是来自参考:
textureFromNode:
呈现并返回包含节点内容的Sprite Kit纹理.
- (SKTexture *)textureFromNode:(SKNode *)node
Run Code Online (Sandbox Code Playgroud)
参数
节点
表示要渲染到纹理的内容的节点对象.
回报价值
保存渲染图像的Sprite Kit纹理.
讨论 正在渲染的节点不需要出现在视图的呈现场景中.创建新纹理的大小等于节点的calculateAccumulatedFrame方法返回的矩形.如果节点不是场景节点,则使用清晰的背景颜色([SKColor clearColor])进行渲染.
更新 - 在探索SKShapeNode之后,确认存在内存泄漏问题,围绕分配路径然后删除节点,我有一个想法......
不是一个新想法,更多是一个改变用途的想法.这个奇妙的想法实际上允许我使用SKShapeNodes到我心中的内容:)
POOLING
是的......我刚创建了一个SKShapeNodes池,我根据需要重用了它.这有什么不同:)所以只需在需要的时候重新定义路径,当使用返回你的游泳池完成时,它将等待你以后再次玩.
您只需在需要时重新定义路径,使用返回游泳池完成后,它将等待您稍后再次玩游戏.
NSMutableArray在SKScene被调用的池中创建一个ivar或property ,并在初始化时创建它SKScene.您可以在init期间使用形状节点填充数组,也可以根据需要创建它们.
这是我为从池中获取新节点而创建的快速方法:
-(SKShapeNode *)getShapeNode
{
if (pool.count > 0)
{
SKShapeNode *shape = pool[0];
[pool removeObjectAtIndex:0];
return shape;
}
// if there is not any nodes left in the pool, create a new one to return
SKShapeNode *shape = [SKShapeNode node];
return shape;
}
Run Code Online (Sandbox Code Playgroud)
所以无论你在场景中需要SKShapeNode,你都会这样做:
SKShapeNode *shape = [self getShapeNode];
// do whatever you need to do with the instance
Run Code Online (Sandbox Code Playgroud)
完成使用shape节点后,只需将其返回到池并将路径设置为.例如 :
[pool addObject:shape];
[shape removeFromParent];
shape.path = NULL;
Run Code Online (Sandbox Code Playgroud)
我知道这是一种解决方法,而不是一个理想的解决方案,但对于任何想要使用大量SKShapeNodes而不是流失内存的人来说,这肯定是一种非常可行的解决方法.
| 归档时间: |
|
| 查看次数: |
3728 次 |
| 最近记录: |