腾讯大咖说:腾讯是如何做Unity手游性能优化的

2023-11-09 04:10

本文主要是介绍腾讯大咖说:腾讯是如何做Unity手游性能优化的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自 腾讯大咖说:腾讯是如何做Unity手游性能优化的

一.常见的Unity手游性能问题有哪些?

在这里插入图片描述

左边是玩家经常会遭遇到的 表面现象 .
右边则是 基于Unity引擎深挖后的问题本质 .

《王者荣耀》来举例. 先后遇到过的问题和优化方法主要有下面几个:

  1. 池化技术

由于实时对战游戏的数据包数量巨大,早期版本的帧同步策略会导致比较明显的卡顿,通过进行数据包的合并与优化逐渐解决了卡顿问题;
频繁创建和销毁的小兵对象让CPU爆表了,大量的小兵如果采用实时内存的分配和回收,会产生大量的内存碎片和系统开销,解决方法之一就是采用高效的对象池进行优化,对每个内存对象的状态进行操作即可;

  1. 视野裁剪技术

性能分析过程中,发现单人同屏和多人同屏时的开销都很大,通过视野裁剪技术,使得玩家视野外的不必要的特效和渲染可以全部关闭,极大降低了CPU、GPU和内存的开销;

  1. 不同层次的特效包

在高中低三档机型上玩游戏时,分别加载不同层次的特效包,这也有助于降低CPU和内存的开销;

  1. 降低drawcall
    游戏内界面采用了UGUI的方式实现,但大量的实时UI变化使得副本内每帧会有230以上的drawcall,导致中低端机型感受到明显卡顿,最终采用UGUI+自研究UI的组合拳,重写了一套紧密结合游戏自身特性的UI来实现战斗血条和浮动文字的效果。

二. 手游发布之前的性能分析

在这里插入图片描述
功能测试 也就是通常所说的人肉测试,用于测试游戏的新、老功能点,测试工程师在工作过程中可以使用Cube进行数据采集;

自动化测试 则是基于腾讯WeTestgautomator自动化框架来实现,功能类似于Robotium,在无须人力参与的情况下能覆盖到绝大部分技能、角色和关卡;

灰度发布 指的是在一个很小范围定点推送手游的新版本,并观察运营期的质量情况和玩家反馈。

无论是哪种测试方法,在过程中都可以用Cube进行数据采集,在测试完成后,服务器会自动进行数据分析并给出多项性能数据结论;
这些性能数据的结论来自于Unity官方的推荐标准值和腾讯游戏海量的经验库,如果同意机器给出的结论则可以巩固当前算法,当然也可以挑战自动分析的结论,帮助后台改进算法,最终版本质量结论还是来自于测试经理的判断。

常见的产品质量改进流程无非是下面这四步:

  1. 测试人员发现问题;
  2. bug 给开发人员;
  3. 开发人员编译develop版本;
  4. 开发人员用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手游性能优化的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373918

相关文章

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.

Java慢查询排查与性能调优完整实战指南

《Java慢查询排查与性能调优完整实战指南》Java调优是一个广泛的话题,它涵盖了代码优化、内存管理、并发处理等多个方面,:本文主要介绍Java慢查询排查与性能调优的相关资料,文中通过代码介绍的非... 目录1. 事故全景:从告警到定位1.1 事故时间线1.2 关键指标异常1.3 排查工具链2. 深度剖析: