Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Sprite kit SKTEXTEREATLAS加载和内存管理_Sprite Kit - Fatal编程技术网

Sprite kit SKTEXTEREATLAS加载和内存管理

Sprite kit SKTEXTEREATLAS加载和内存管理,sprite-kit,Sprite Kit,我在SpriteKit上开发了一个游戏,每个场景都有多个场景 至少从3个纹理层开始 每个纹理中图像的最大大小为60K 我的游戏因内存问题而崩溃 我在每个场景中所做的是在头文件中定义动作,例如: initialise them in -(id)initWithSize:(CGSize)size Function @interface FirstLevel : SKScene { SKAction *RedBirdAnimation; } 在实施文件中: -(id)initWi

我在SpriteKit上开发了一个游戏,每个场景都有多个场景 至少从3个纹理层开始 每个纹理中图像的最大大小为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;}
在我的游戏中加载纹理图集是否有类似的最佳实践 以防止它因内存而崩溃

我在每一个场景的结尾都用Nil做了所有的SkAction 并删除所有SkSpriteNode的所有操作

有什么解决办法吗

每个纹理层为60K

作为一个文件。但这不是内存使用。要计算图像文件的内存使用量,请获取文件的尺寸并将其与颜色位深度相乘(通常32位=4字节)

例如,4096x4096纹理使用16 MB的纹理内存(但作为PNG文件,它可能远小于1 MB)


长话短说:使用仪器验证应用程序的实际内存消耗。

纹理太大,系统无法加载。您需要将图像分解为两个或多个单独的纹理,以允许系统管理内存。将初始设置所需的图像放置在自己的图集中,以便您可以在游戏开始时预装这些图像。将图像作为单个文件进行引用,系统将根据需要加载和卸载地图集。系统可以更好地管理内存,你可以让它这样做。

基于SpriteKit的游戏内存不足的问题几乎总是由开发人员使用如此多的纹理造成的,以至于所有活动RAM都被纹理消耗掉。我将假设您使用标准的基于SKAction的动画方法,并且您没有任何由强引用或任何东西导致的奇怪内存泄漏。确定纹理消耗的RAM量的正确方法是(宽度*高度*4/1000),这表示存储纹理所需的内存kB数。对于4096x4096纹理,即67108 kB或约68兆。无论是将其存储在atlas中还是作为单个纹理存储。减少SpriteKit游戏使用的内存总量的关键是减少每个纹理消耗的内存量。请看一下这方面的源代码,它显示了如何减少每帧的内存使用量,从而将非常复杂的alpha通道动画从286兆降至130兆,该动画在64位iOS系统上以60FPS的速度执行。此方法仅适用于A7和更新的64位系统。如果您正在寻找质量较低但完全免费的方法,请参阅SpriteKit的非常有损纹理压缩方法。作为最后的努力,可以将每个纹理的宽度和高度减少1/2,然后在渲染到节点时将纹理重新缩放,但效果并不理想,但在运行时使用的内存减少了4倍。

崩溃发生的时间?在一段时间后发生。我验证我的应用程序在游戏开始时消耗的内存约为100 MB,在玩游戏后达到250 MB,并在一段时间后崩溃。请帮助我如何以安全的方式加载SKTextureAtlas,以防止由于memory@user3429971你创建文件夹了吗名字:纹理。阿特拉斯?(纹理只是一个例子,重要的是.atlas)通过这种方式,Xcode减少了每个spritey的内存使用量。我制作的每个纹理都是在RedBid.atlas.atlas等文件夹中创建的on@LearnCocos2D你能帮我如何在游戏中安全地加载纹理吗?这个计算不正确,一个4字节的4096x4096纹理消耗大约68兆的内存,而不是16.1兆=1024KB;1kb=1024b;1 B=8位。因此,您必须除以1024,而不是1000,上面的例子正好是64MB。kB表单表示使用1000作为倍数,在MacOSX Explorer中查看文件大小时也可以看到这种格式:谢谢-我不知道。根据这个,我说的是kibibytes,你的答案完全正确:-)因此67.108864MB等于64MIB。
4096 x 4096 x (32/8) = 16 Megabytes