最近Android包频繁崩溃,经查询是SpriteAtlas图集在频繁调用GetSprite()接口,产生的内存泄露。
那么为什么频繁调用GetSprite就会内存泄露呢?
请先看下接口介绍:
1 2 3 4 5 6 7 8 9 |
// // 摘要: // Clone the first Sprite in this atlas that matches the name packed in this atlas // and return it. // // 参数: // name: // The name of the Sprite. public Sprite GetSprite(string name); |
注意看摘要,它说是Clone,也就是说每次调用GetSprite,都会执行一次克隆操作,并且不会自动释放。
如下图
于是做了个缓冲池,重复的sprite直接从池子里获取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public static class SpriteAtlasExtention { private static Dictionary<string, Sprite> sprites = new Dictionary<string, Sprite>(); public static Sprite GetSprite_Ex(this SpriteAtlas atlas, string spriteName) { if (string.IsNullOrEmpty(spriteName)) { Debuger.LogError("获取图片失败,spriteName为空"); return null; } if (atlas == null) { Debuger.LogError("获取图片失败,atlas为空"); return null; } string name = atlas.name + spriteName; if (sprites.ContainsKey(name)) { if (sprites[name] == null) sprites[name] = atlas.GetSprite(spriteName); return sprites[name]; } else { sprites.Add(name, atlas.GetSprite(spriteName)); return sprites[name]; } } public static void Clear() { sprites.Clear(); } } |
用了缓冲池后的效果
- 本文固定链接: http://www.u3d8.com/?p=2602
- 转载请注明: 网虫虫 在 u3d8.com 发表过