Ios 程序生成的CGContext图像占用大量内存
我正在使用SpriteKit和Swift创建一个空间探索游戏。我正在使用核心图形生成一个空间环境。因为玩家可以控制一艘可以向各个方向移动的宇宙飞船,所以我创建了9个不同的背景,并将它们放置在用户飞船周围,就像这样 789Ios 程序生成的CGContext图像占用大量内存,ios,swift,memory-management,sprite-kit,core-graphics,Ios,Swift,Memory Management,Sprite Kit,Core Graphics,我正在使用SpriteKit和Swift创建一个空间探索游戏。我正在使用核心图形生成一个空间环境。因为玩家可以控制一艘可以向各个方向移动的宇宙飞船,所以我创建了9个不同的背景,并将它们放置在用户飞船周围,就像这样 789 4.56 1 2 3 玩家从第五层开始。我的游戏使用带有aspectFill的2048x1536屏幕,因此我可以支持所有分辨率 我用这段代码生成背景 UIGraphicsBeginImageContext(CGSizeMake(width, height)) let ctx =
4.56
1 2 3 玩家从第五层开始。我的游戏使用带有aspectFill的2048x1536屏幕,因此我可以支持所有分辨率 我用这段代码生成背景
UIGraphicsBeginImageContext(CGSizeMake(width, height))
let ctx = UIGraphicsGetCurrentContext();
let max = width * height / CGFloat(starCountModifier)
for i in 0...Int(max)
{
let x = arc4random_uniform(UInt32(width))
let y = arc4random_uniform(UInt32(height))
let alpha = CGFloat(Float(arc4random()) / Float(UINT32_MAX))
CGContextSetFillColorWithColor(ctx, SKColor(red: 1.0, green: 1.0, blue: 1.0, alpha: alpha * alpha * alpha).CGColor)
CGContextFillRect(ctx, CGRect(x: CGFloat(x), y: CGFloat(y), width: 2, height: 2))
}
let textureImage: UIImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext()
let texture = SKTexture(CGImage: textureImage.CGImage)
let sprite = SKSpriteNode(texture: texture)
addChild(sprite)
它可以解决一个问题。我创建的每个背景都需要大约20-25mb的内存
即使我不画星星,它也仅仅通过在上下文中创建SKSpriteNode来分配这么多内存
有没有办法优化此纹理数据
谢谢。您可以创建一个粒子位置范围略大于屏幕大小的SKEmitterNode。将emissionAngle设置为移动方向-180,并将particleSpeed设置为播放器移动的速度。另一个选项是像您那样创建九个容器节点,并用随机的SKSpritodes填充容器节点。然后,您可以像使用背景一样使用它们,但对内存的影响要小得多(您也可以随时修改它们,而无需生成新纹理)。如果您需要我的任何建议并举例说明,请询问。仅针对纹理数据,假设2048x2048纹理大小,每种颜色32位(4字节),您将得到16兆的纹理。要优化,你可以减少尺寸或颜色位深度-但我不知道如何做你正在做的后者。我也不明白为什么你首先需要生成像素星?只需在背景中使用一个星图并重复它,没有人会注意到它们会重复。然后在顶部添加一些其他单独的图像:行星、大恒星、星云等。谢谢回答。实际上,我可以优化代码以更快/更好地运行。然而,我想知道是否有任何方法可以降低使用上下文后分配的纹理内存,例如光栅化或以某种方式压缩它。谢谢你有没有找到从未使用的纹理中释放内存的方法?