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

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

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

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

  一、贴图占用内存优化

  (1)缩减贴图占用内存

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

  举个例子:一张512x512贴图。

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

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

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

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

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

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

  

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

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

  举个例子:新手引导图集(调整前1024x1024,4MB)。

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

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

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

  新手引导图集(调整后1024x512,2MB)。

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

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

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

  (3)及时回收过时资源

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

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

  实践中发现几个现象:

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

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

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

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

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

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

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

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

  其中包含几个关键方法:

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

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

  二、字体占用内存优化。

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

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

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

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

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

  三、效果举例。

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

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

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

用户喜欢...

【Cocos2d-x游戏开发】Cocos2d-x中的弱联网技术

在上一篇博客《【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术》中,我们一起学习了如何在Cocos2d-x中存储数据和读取信息,本篇博客我们将一起讨论和数据存储同样重要的联网技术。 一、弱...


恩智浦助力孩之宝与Harmonix推出的动感混音游戏DROPMIX近场通信体验

恩智浦半导体作为近场通信(NFC)技术的发明者,非常荣幸地宣布其与全球游戏和娱乐公司孩之宝公司(纳斯达克代...


【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术

一、引言 数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉...


Android内存泄漏思考

Android内存泄漏是一个经常要遇到的问题,程序在内存泄漏的时候很容易导致OOM的发生。那么如何查找内存泄漏和避免内存泄漏就是需要知晓的一个问题,首先我们需要知道一些基础知识。...


游戏开发中的人工智能(十四):神经网络(1)

接上文 游戏开发中的人工智能(十三):不确定状态下的决策:贝叶斯技术 本文内容:“神经网络”技术让游戏具有学习和适应的能力。事实上,从决策判断到预测玩家的行为,都可以应用...


游戏开发中的人工智能(十三):不确定状态下的决策:贝叶斯技术

接上文 游戏开发中的人工智能(十二):概率概论 本文内容:贝叶斯技术是概率技术,本章解释如何运用,以便在游戏中做决策并适应游戏。 不确定状态下的决策:贝叶斯技术 本章要介绍...


游戏开发中的人工智能(十一):规则式 AI

接上文 游戏开发中的人工智能(十):模糊逻辑 本文内容:技术上而言,有限状态机和模糊逻辑都落在基于规则的方法这个大伞之下。本章将谈这些方法,以及其他变化的方法。 本章我们要...


游戏开发中的人工智能(十二):概率概论

接上文 游戏开发中的人工智能(十一):规则式 AI 本文内容:游戏开发人员时常使用简单的概率,使游戏较难预测。这种简单的不可预测性让游戏开发人员可以拥有对游戏的实质性控制。本...


工业 4.0 改写市场游戏规则

“只有大型工厂才须关心工业 4.0”,这种似是而非的观念一直是个谜团...


游戏开发中的人工智能(十):模糊逻辑

接上文 游戏开发中的人工智能(九):有限状态机 本文内容:开发人员经常把模糊逻辑和有限状态机结合起来使用,甚至取代有限状态机。本章将会学到模糊逻辑为什么优于传统的逻辑技术...


干货:Unity游戏开发图片纹理压缩方案

对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式。 在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成...


游戏开发中的人工智能(八):描述式 AI 及描述引擎

接上文 游戏开发中的人工智能(七):A* 路径寻找算法 本文内容:程序员通常只写描述引擎,而由设计者使用工具创建内容和定义 AI。本章探讨一些开发人员把描述系统应用在游戏中的技巧...


游戏开发中的人工智能(九):有限状态机

接上文 游戏开发中的人工智能(八):描述式 AI 及描述引擎 本文内容:有限状态机是游戏软件 AI 的基本要素。本章探讨有限状态机的基础,以及如何予以实现。 有限状态机 有限状态机是一...


兆芯开先KX-5000系列国产x86处理器闪耀2017工博会

第19届中国国际工业博览会在上海国家会展中心正式开幕。继参展上届工博会取得强烈反响之后,上海兆芯集成电路有...


游戏开发中的人工智能(七):A* 路径寻找算法

A* 路径寻找算法 路径寻找是游戏软件AI 最基本的问题之一。A* 算法是当今游戏软件开中,相当常用的一种。A* 算法之所以会如此吸引人,是因为它可以保证在任何起点及任何终点间找到最佳...


英特尔在冬奥会前夕将电子竞技带到平昌

英特尔宣布计划于明年2月冬季奥运会举办前夕,将一场令人震撼的电竞游戏体验带到韩国平昌。作为国际奥委会全球...