为了账号安全,请及时绑定邮箱和手机立即绑定

SKTextureAtlas加载和内存管理

SKTextureAtlas加载和内存管理

月关宝盒 2019-10-12 13:49:41
我在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动作有什么办法吗
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

每个TextureAtlas是60K


作为文件。但这不是内存使用情况。要计算图像文件的内存使用量,请计算文件的尺寸,然后将它们乘以颜色位深度(通常为32位= 4字节)。


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


4096 x 4096 x (32/8) = 16 Megabytes

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


查看完整回答
反对 回复 2019-10-12
?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

基于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倍。


查看完整回答
反对 回复 2019-10-12
  • 3 回答
  • 0 关注
  • 599 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信