Unity3D游戏内存瘦身 UI优化是关键


2015-12-15  Gad-腾讯游戏开发者平台

游戏占用的内存中,UI部分主要是贴图资源和字体资源。其中贴图是单张图片,而字体包括UIFontTrueTypeFontTTF

资源占用内存大小,从Unity Profiler看到许多细节。

Unity3D游戏内存瘦身 UI优化是关键_第1张图片

一、贴图占用内存优化

1)缩减贴图占用内存

注意,贴图资源占用内存大小不等于文件大小,而是与资源导入设置有关。同一个导入设置则只与资源宽高尺寸有关,与资源原始文件格式无关。在进行安装包大小瘦身时,已针对各种应用场景,有损或无损的缩减贴图资源大小。由于资源加载后占用内存大小与安装包打包前资源大小一致,所以安装包瘦身实际上也是在减少贴图资源占用内存大小。

举个例子:一张512x512贴图

使用RGBA 32bit真彩,占用内存 = 4Bytes*512*512 = 1MB

使用RGB ETC 4bit压缩,占用内存 = 0.5Bytes*512*512 = 128KB

具体的压缩选型和操作细节,可参考安装包瘦身一文。


传送门:

摆脱臃肿--Unity3D安卓包减肥秘笈 (一)

摆脱臃肿--Unity3D安装包减肥秘笈(二)

Unity3D游戏内存瘦身 UI优化是关键_第2张图片

某些压缩方式是无损的,某些是有损的,按需采用。

二维纹理 Texture 2D 的导入参数说明

http://game.ceeger.com/Components/class-Texture2D.html

2拆分大资源,且按需加载

贴图资源使用方式包括UITextureUIAtlas这两类其本质都是一张图片,区别在于UITexture是单张大图,而UIAtlas是多张小图合集做成一张大图某些应用场景中可以将大尺寸UIAtlas拆分为小尺寸UIAtlas多个UITexture然后按需加载显示。拆分后内存占用大小<=拆分前内存占用大小。

举个例子:新手引导图集调整前1024x10244MB

Unity3D游戏内存瘦身 UI优化是关键_第3张图片

单局中并不需要同时显示全部角色和道具Icon于是可拆分成多个,按需加载即可减少占用内存总大小

Unity3D游戏内存瘦身 UI优化是关键_第4张图片

新手引导图集(调整后1024x5122MB)。

Unity3D游戏内存瘦身 UI优化是关键_第5张图片

再加数个拆分出来的小图(几百KB)。

Unity3D游戏内存瘦身 UI优化是关键_第6张图片

3)及时回收过时资源

方法1优化常驻内存大小。如果一张贴图使用后不再被使用没有被及时回收,那么内存占用总量只增不减。这些过时资源应及时回收。

Unity3D游戏内存瘦身 UI优化是关键_第7张图片

实践中发现个现象:

Unity3D游戏内存瘦身 UI优化是关键_第8张图片

现象

处理

编辑器单个资源占用大小值是真机的两倍。

以真机为准

编辑器停止运行游戏,再次运行时依然看到上次运行时的贴图资源,需重新启动编辑器才能彻底清除。

编辑器自身引用了资源。以真机为准

GameObjectDestroy销毁后,依然看到贴图资源有被引用。编辑器和真机现象一样。

下文细说解决方案

回收UI资源的代码片段(供参考)

Unity3D游戏内存瘦身 UI优化是关键_第9张图片

方法Application.LoadLevel前后执行。此方法有些暴力,全部UITextureUIAtlas贴图资源都被扫描且可能UnloadAsset

此处白名单Texture和动态创建Texture需单独处理否则可能报错举例:下图是UnloadAsset网络下载的玩家头像报错了。

Unity3D游戏内存瘦身 UI优化是关键_第10张图片

如果贴图资源再次使用,那么在加载prefab时会重新加载相关贴图资源

其中包含几个关键方法:

Resources.FindObjectsOfTypeAll

区别于Object.FindObjectsOfType,此方法返回任意类型的已加载对象列表,且包含非激活对象。

Resources.UnloadAsset

卸载Resources.Load所加载的资源。

UIDrawCall.ReleaseInactive

释放UIDrawCall的非激活缓存列表

Resources.UnloadUnusedAssets

卸载未使用的资源

System.GC.Collect

强制进行垃圾回收。

System.GC.WaitForPendingFinalizers

挂起当前线程,直到处理终结器队列的线程清空该队列为止。

注意这里卸载资源用协程分了几帧实现受限于上述方法的先后执行顺序,放在同一帧处理达不到卸载的目的。

二、字体占用内存优化。

1UIFont字体,占用内存大小与字体贴图资源导入设置有关。优化思路同Texture贴图包括缩小字号、只制作所需字符、复用字体等。比如以下字体同时用在单局结算分数和伙伴技能冒字。

Unity3D游戏内存瘦身 UI优化是关键_第11张图片

2TTF字体,占用内存大小等于文件大小。优化思路是尽量复用字体,减少使用差异化字体。



Unity3D游戏内存瘦身 UI优化是关键_第12张图片

三、效果举例

经过先前安装包瘦身,已减少几十MB贴图资源占用内存

又依照上述方法优化包括缩减资源尺寸(红色)、卸载过时资源(绿色)、整合字体(橙色)进一步减少26MB内存占用

Unity3D游戏内存瘦身 UI优化是关键_第13张图片


免费组件下载丨专业知识学习丨组队游戏制作丨项目孵化渠道

Unity3D游戏内存瘦身 UI优化是关键_第14张图片

腾讯游戏开发者平台 Gad微信号:Gad-GameDev

腾讯游戏出品,国内业界首家专业独立游戏开发者平台。

Gad面向游戏从业者,打造开放、互联、回馈、分享的专业游戏人社区。

Unity3D游戏内存瘦身 UI优化是关键_第15张图片


阅读原文

你可能感兴趣的:(Unity3D游戏内存瘦身 UI优化是关键)