Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 程序生成的CGContext图像占用大量内存_Ios_Swift_Memory Management_Sprite Kit_Core Graphics - Fatal编程技术网

Ios 程序生成的CGContext图像占用大量内存

Ios 程序生成的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 =

我正在使用SpriteKit和Swift创建一个空间探索游戏。我正在使用核心图形生成一个空间环境。因为玩家可以控制一艘可以向各个方向移动的宇宙飞船,所以我创建了9个不同的背景,并将它们放置在用户飞船周围,就像这样

789
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兆的纹理。要优化,你可以减少尺寸或颜色位深度-但我不知道如何做你正在做的后者。我也不明白为什么你首先需要生成像素星?只需在背景中使用一个星图并重复它,没有人会注意到它们会重复。然后在顶部添加一些其他单独的图像:行星、大恒星、星云等。谢谢回答。实际上,我可以优化代码以更快/更好地运行。然而,我想知道是否有任何方法可以降低使用上下文后分配的纹理内存,例如光栅化或以某种方式压缩它。谢谢你有没有找到从未使用的纹理中释放内存的方法?