SKTextureAtlas加载和内存管理

我在SpriteKit上开发了一个游戏,每个场景有多个场景,每个场景都有3个TextureAtlas,每个TextureAtlas中图像的最小和最大大小为60K,我的游戏因内存崩溃而崩溃


我在每个场景中所做的就是在头文件中定义动作,例如:


initialise them in -(id)initWithSize:(CGSize)size  Function 



@interface FirstLevel : SKScene

{


    SKAction  *RedBirdAnimation;

}

并在实施文件中:


-(id)initWithSize:(CGSize)size{

if(self=[super initWithSize:size])

{[self setupRedBirdActions];}

return self;

}



-(void)setupRedBirdActions{


    SKTextureAtlas *RedBirdAtlas = [SKTextureAtlas atlasNamed:@"RedBird"]; 


    SKTexture *RedBird1 = [RedBirdAtlas textureNamed:@"Redbird_01_iphone.png"];

    SKTexture *RedBird2 = [RedBirdAtlas textureNamed:@"Redbird_02_iphone.png"];

    SKTexture *RedBird3 = [RedBirdAtlas textureNamed:@"Redbird_03_iphone.png"];


    NSArray *atlasTexture = @[RedBird1, RedBird2, RedBird3];


    SKAction* atlasAnimation = [SKAction animateWithTextures:atlasTexture timePerFrame:0.2];


    RedBirdAnimation = atlasAnimation;}

有没有在我的游戏中加载纹理图集的最佳实践之类的东西,以防止由于内存而崩溃。


我在每个Skscene的末尾用Nil制作所有SkAction,并从All SkSpriteNode中删除All动作


有什么办法吗


月关宝盒
浏览 600回答 3
3回答

慕娘9325324

每个TextureAtlas是60K作为文件。但这不是内存使用情况。要计算图像文件的内存使用量,请计算文件的尺寸,然后将它们乘以颜色位深度(通常为32位= 4字节)。例如,一个4096x4096的纹理使用16 MB的纹理内存(但作为PNG文件,它可能比1 MB小得多)。4096 x 4096 x (32/8) = 16 Megabytes长话短说:使用Instruments来验证您的应用程序的实际内存消耗。

侃侃尔雅

基于SpriteKit的游戏内存不足的问题几乎总是由开发人员使用太多纹理导致的,这些纹理占用了所有活动RAM。我将假设您使用的是基于SKAction的标准动画方法,并且没有因强引用或其他原因引起的任何奇怪的内存泄漏。确定纹理消耗的RAM数量的正确方法是(WIDTH * HEIGHT * 4/1000),这表示存储纹理所需的kB内存数量。对于4096x4096纹理,即67108 kB或大约68 Meg。这是存储在地图集中还是作为单个纹理都没有关系。实际减少SpriteKit游戏使用的内存总量的关键是减少每个纹理消耗的内存量。请查看此源代码SpriteKitFireAnimation示例说明了如何减少非常复杂的alpha通道动画的每帧内存使用量可以从286 Meg降低到130 Meg,该动画在64位iOS系统上以60FPS执行。此方法仅适用于A7和更新的64位系统。如果您正在寻找质量要求不高,但完全免费的方式,看到这种比较非常有损纹理压缩与SpriteKit方法。作为最后的努力,可以将每个纹理的宽度和高度减小1/2,然后在渲染到节点时将纹理向上缩放,虽然效果不佳,但在运行时使用的内存却少了4倍。
打开App,查看更多内容
随时随地看视频慕课网APP