我在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,并从所有的SkSpriteNode中删除所有的动作
有什么解决方案吗?
发布于 2014-03-18 17:40:52
每个TextureAtlas为60K
也许是作为一个文件。但这不是内存使用量。要计算图像文件的内存使用量,请获取文件的大小并将其乘以颜色位深度(通常为32位=4字节)。
例如,4096x4096纹理使用16 MB的纹理内存(但它可能比1 MB的PNG文件小得多)。
4096 x 4096 x (32/8) = 16 Megabytes长话短说:使用Instruments验证应用程序的实际内存消耗。
发布于 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倍。
发布于 2014-05-15 06:48:31
textureAtlas太大,系统无法加载。您需要将映像分解为两个或更多独立的textureAtlases,以便系统管理内存。将初始设置所需的图像放置在其自己的图集中,以便您可以在游戏开始时预先加载这些图像。引用图像就像它们是单独的文件一样,系统将根据需要加载和卸载地图集。系统可以更好地管理内存,而您可以让它这样做。
https://stackoverflow.com/questions/22470907
复制相似问题