首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKTextureAtlas加载和内存管理

SKTextureAtlas加载和内存管理
EN

Stack Overflow用户
提问于 2014-03-18 13:14:25
回答 3查看 1.8K关注 0票数 4

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

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

代码语言:javascript
复制
initialise them in -(id)initWithSize:(CGSize)size  Function 


@interface FirstLevel : SKScene
{

    SKAction  *RedBirdAnimation;
}

在实现文件中:

代码语言:javascript
复制
-(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,并从所有的SkSpriteNode中删除所有的动作

有什么解决方案吗?

EN

回答 3

Stack Overflow用户

发布于 2014-03-18 17:40:52

每个TextureAtlas为60K

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

例如,4096x4096纹理使用16 MB的纹理内存(但它可能比1 MB的PNG文件小得多)。

代码语言:javascript
复制
4096 x 4096 x (32/8) = 16 Megabytes

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

票数 3
EN

Stack Overflow用户

发布于 2016-07-31 06:39:30

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

票数 3
EN

Stack Overflow用户

发布于 2014-05-15 06:48:31

textureAtlas太大,系统无法加载。您需要将映像分解为两个或更多独立的textureAtlases,以便系统管理内存。将初始设置所需的图像放置在其自己的图集中,以便您可以在游戏开始时预先加载这些图像。引用图像就像它们是单独的文件一样,系统将根据需要加载和卸载地图集。系统可以更好地管理内存,而您可以让它这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22470907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档