腾讯大咖说:腾讯是如何做Unity手游性能优化的
转载自 腾讯大咖说:腾讯是如何做Unity手游性能优化的
一.常见的Unity手游性能问题有哪些?
左边是玩家经常会遭遇到的 表面现象 .
右边则是 基于Unity引擎深挖后的问题本质 .
《王者荣耀》来举例. 先后遇到过的问题和优化方法主要有下面几个:
- 池化技术
由于实时对战游戏的数据包数量巨大,早期版本的帧同步策略会导致比较明显的卡顿,通过进行数据包的合并与优化逐渐解决了卡顿问题;
频繁创建和销毁的小兵对象让CPU爆表了,大量的小兵如果采用实时内存的分配和回收,会产生大量的内存碎片和系统开销,解决方法之一就是采用高效的对象池进行优化,对每个内存对象的状态进行操作即可;
- 视野裁剪技术
性能分析过程中,发现单人同屏和多人同屏时的开销都很大,通过视野裁剪技术,使得玩家视野外的不必要的特效和渲染可以全部关闭,极大降低了CPU、GPU和内存的开销;
- 不同层次的特效包
在高中低三档机型上玩游戏时,分别加载不同层次的特效包,这也有助于降低CPU和内存的开销;
- 降低drawcall
游戏内界面采用了UGUI的方式实现,但大量的实时UI变化使得副本内每帧会有230以上的drawcall,导致中低端机型感受到明显卡顿,最终采用UGUI+自研究UI的组合拳,重写了一套紧密结合游戏自身特性的UI来实现战斗血条和浮动文字的效果。
二. 手游发布之前的性能分析
功能测试 也就是通常所说的人肉测试,用于测试游戏的新、老功能点,测试工程师在工作过程中可以使用Cube进行数据采集;
自动化测试 则是基于腾讯WeTestgautomator自动化框架来实现,功能类似于Robotium,在无须人力参与的情况下能覆盖到绝大部分技能、角色和关卡;
灰度发布 指的是在一个很小范围定点推送手游的新版本,并观察运营期的质量情况和玩家反馈。
无论是哪种测试方法,在过程中都可以用Cube进行数据采集,在测试完成后,服务器会自动进行数据分析并给出多项性能数据结论;
这些性能数据的结论来自于Unity官方的推荐标准值和腾讯游戏海量的经验库,如果同意机器给出的结论则可以巩固当前算法,当然也可以挑战自动分析的结论,帮助后台改进算法,最终版本质量结论还是来自于测试经理的判断。
常见的产品质量改进流程无非是下面这四步:
- 测试人员发现问题;
- bug 给开发人员;
- 开发人员编译develop版本;
- 开发人员用Unity profiler 定位原因;
用Cube进行游戏测试能帮你省掉后面2个步骤. 何乐不为.
三. 性能优化的N种武器
贴图:
- 控制贴图大小. 尽量不要超过1024x1024;
- 尽量使用2的n次幂大小的贴图,否则GfxDriver里会有2份贴图
- 尽量使用压缩格式减小贴图大小
- 若干种贴图合并技术
- 去除多余的alpha通道
- 不同设备使用不同的纹理贴图,分层显示
模型
- 尽量控制模型的面片数. 小于1500会比较合适;
- 不同设备使用不同的模型面数;
- 尽量保持在30根骨骼内;
- 一个网格不要使用超过3个Material;
动画
- N种动画压缩方法;
- 尽量减少骨骼数量;
声音
- 采用压缩MP3 和 wav
资源方面的优化
- 使用 Resource.Load 方法在需要的时候再读取资源;
- 各种资源在使用完成后,尽快用Resource.UnloadAsset和UnloadUnusedAsset卸载掉;
- 灵活运用AssetBundle的Load和Unload方法动态加载资源,避免主要场景内的初始化内存占用过高;(实现起来真的很难…)
- 采用www加载了AssetBundle后,要用www.Dispose 及时释放;
- 在关卡内谨慎使用DontDestroyOnLoad,被标注的资源会常驻内存;
代码的优化
- 尽量避免代码中的任何字符串连接,因为这会给GC带来太多垃圾;
- 用简单的“for”循环代替“foreach”循环;
- 为所有游戏内的动态物体使用 内存对象池 ,可以减少系统开销和内存碎片,复用对象实例,构建自己的内存管理模式,减少Instantiate和Destory;
- 尽量不使用LINQ命令,因为它们一般会分配中间缓器,而这很容易生成垃圾内存;
- 将* 引用本地缓存到元件* 中会减少每次在一个游戏对象中使用 “GetComponent” 获取一个元件引用的需求;
- 减少角色控制器移动命令的 调用。移动角色控制器会同步发生,每次调用都会耗损较大的性能;
- 最小化碰撞检测请求(例如ray casts和sphere checks),尽量从每次检查中获得更多信息;
- AI逻辑通常会生成大量物理查询,建议让AI更新循环设置低于图像更新循环,以减少CPU负荷;
- 要尽量减少Unity回调函数,哪怕是空函数也不要留着;(例如空的Update、FixedUpdate函数)
- 尽量少使用FindObjectsOfType函数,这个函数非常慢,尽量少用且一定不要在Update里调用;
- 千万一定要控制mono堆内存的大小;
四. 小结
性能优化就像海绵中的水,又或是内衣里的肉,挤一挤总会有的。同时,性能优化并不是一劳永逸的工作,而是一个漫长而具有挑战的任务;项目的各个阶段都会有性能上的问题,在用户体验的基础上持续进行打磨,持续保持产品的良好性能才能赢得好口碑。(和保持身体健康是一个道理)
Unity手游的性能优化过程更像是一门时空转换的艺术, 持续在CPU和内存之间取得一个平衡。空间不足时则需要释放一些无用数据,以获得更优的空间使用率;时间太长时就需要降低不必要的函数开销。例如在低端机上,为了节约有限的内存空间,静态加载的资源会相对较少,很大一部分资源通过动态加载和释放;而在高端机上则不用考虑空间的限制,可以一次性静态加载更多的资源,省去了不少loading和GC的工作,让游戏体验更加流畅。
腾讯大咖说:腾讯是如何做Unity手游性能优化的相关推荐
- 腾讯是如何做Unity手游性能优化的
他山之石-腾讯是如何做Unity手游性能优化的 本文转载自:http://www.taidous.com/thread-44045-1-1.html?_dsign=ba1258b9 俗话说,用户体验不 ...
- 腾讯大咖分享 | 腾讯Alluxio(DOP)在金融场景的落地与优化实践
目录 Alluxio导读 背景 大数据olap分析面临的挑战 Alluxio:一种可能更优的方案 新的挑战 最终架构 线上运行效果 优化调优实践 总结展望 Alluxio导读 近期,腾讯 Alluxi ...
- 腾讯大咖说:战术竞技类手游性能如何管理?
MPD是Make Professional Discovery的缩写,MPD工作坊是一个围绕岗位角色发展的实践课堂,是由全球软件.互联网企业教练.一线研发团队带头人联合开发的角色胜任能力模型,是一种持 ...
- 【腾讯优测干货分享】使用多张图片做帧动画的性能优化
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57fc8cea302e4725036142f6 使用多张图片做帧动画的性能优 ...
- java如何运用多帧图片_【腾讯优测干货分享】使用多张图片做帧动画的性能优化...
使用多张图片做帧动画的性能优化 背景 QQ群的送礼物功能需要加载几十张图然后做帧动画,但是多张图片加载造成了非常大的性能开销,导致图片开始加载到真正播放动画的时间间隔比较长.所以需要研究一些优化方案提 ...
- 【腾讯优测干货分享】使用多张图片做帧动画的性能优化 1
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57fc8... 使用多张图片做帧动画的性能优化 背景 QQ群的送礼物功能需要 ...
- 一直在路上 | 多位顶尖技术大咖入驻腾讯云最具价值专家
腾讯云最具价值专家,简称 TVP(Tencent Cloud Valuable Professional),是腾讯云颁发给第三方技术专家们的一项荣誉认证,以此感谢他们为推动云计算技术的发展所作出的贡献 ...
- 【Elasticsearch】腾讯万亿级 Elasticsearch 内存效率提升解密 源码级别 性能优化
1.概述 转载:腾讯万亿级 Elasticsearch 内存效率提升解密 这个东东,看了之后,里面性能优化.很有用. 万亿存储,开源协同 Elasticsearch( ES )是一款功能强大的开源分布 ...
- 腾讯云大学大咖分享 | 腾讯云知识图谱实践
本文作者:腾讯云高级研究员 孟辉.毕业于中国科学院大学控制科学与工程系,具有丰富的机器学习与数据挖掘经验.加入腾讯云AI语义产品组后,主要负责知识图谱相关产品的研发与应用. 点击观看完整课程 知识图谱 ...
- nuxt解决首屏加载慢问题_滴普大前端 | 滴普是如何实现首屏加载性能优化的?...
决定优化方向 首先打开 Inspect - Network 查看请求情况,从图片可以看出,DOMContentLoaded 时间为 2.67s,Load 时间为 3.45s,资源交换为 2.4MB. ...
最新文章
- mybatis动态sql中的trim标签的使用
- 机器学习-情感分析-入门实战案例
- 针对还没搞懂javascript中this关键字的同学
- JVM----Java内存区域
- 阿里云与达摩院合作 AHPA 弹性预测论文被顶会 ICDE 录用
- java加载一个来自项目之外的java文件,执行其main方法的一种实现方式
- Docker环境下:ImportError: libSM.so.6: cannot open shared object file: No such file or directory
- Session在类库中的使用
- 银行计算机设备日常检查表,[计算机]201154安全检查表.doc
- android meta-data定义,Android中meta-data的使用
- C++笔记-char*存储的二进制转成long long十进制(读串口的时候经常用到)
- 程序员“小白”打野升级指南,值得收藏
- 2020年python工资一般多少-2020届毕业生874万,这个岗位月薪2万竟无人问津...
- 论文 | 科研软件 —— SPSS Statistics V26.0安装及注册教程
- 微信小程序 图片长按识别功能 笔记
- autojs指纹验证
- 今日新闻早报 精选简报12条 每天一分钟 知晓天下事 2月3日
- BUUCTF misc 二维码1解题思路
- 人不可貌象、小三不可斗量
- ml基础算法参数设置
热门文章
- 汇编语言_debug中R/D/E/U/T/A指令的使用
- 路漫漫其修远兮,吾将上下而求索——学习是一个过程
- 解决adb报5037问题的思路---切换端口
- Day11:股市基本知识
- (附源码)springboot网络空间安全实验教学示范中心网站 毕业设计 111454
- DBeaver查询结果页被隐藏时的处理办法
- oracle12546权限被拒绝,tnsping遇到TNS-12546: TNS: 权限被拒绝
- 国内营商环境测评指标简介——国家级、省市级和民间指标比较分析
- 呼市中专计算机高考试题,呼和浩特市人教版物理高二选修2-1 6.3电子计算机同步练习...
- 剑桥计算机博士姓名,我的剑桥博士生活系列之一