Unity之性能分析特别篇

2023-10-30

Unity的性能优化大家一定很熟悉了。

我在Unity4~5的时期,做过多款大型在线射击对战类网游,超大地形加载优化。对性能分析优化工作和在使用Profiler的过程中总结了一些经验。今天才有空分享出来,欢迎大家讨论,和提出不同的见解。给Unity优化工作的朋友一些启发和帮助。

写本文的目的不是教你怎样使用Profiler,而是在工作中发现和看到了一些问题,引发了一些思考。在这个基础上产生的一些想法,本文没有技术层面的知识,只是总结的思想、方法。

性能测试需持严谨的态度,理性的看待问题

了解和使用过的小伙伴们,都知道就是使用Profiler能看到哪些地方比较耗费CPU,GPU效率,吃内存。在项目进行到一定阶段的时候,一定会进行的任务。
一些又责任心的程序会自己筛查自己的、甚至发现他人的有性能问题,内存问题的代码。

在工作过程中,有时发现有些程序在分析性能和得出结论可能是完全错误的,如果不够慎重处理,小的来说影响了几天工作,大的来说,可能会影响了整个项目组的工作方向,导致产品开发的失败。所以性能的测试分析结果是要非常认真对待的一件事情。
对待性能问题,要保持初心,要经过反复的对比测试,穷举测试,保持测试结论的科学严谨性。不能凭直觉和应该觉得就拿出一个结论。

举例说明,假设游戏开发阶段要对模型进行减免,游戏里大概有50多种怪物模型需要减免,如果一个不严谨的测试,得出结论把10000面减少到5000面,游戏就可以流畅了。那么整个美术组同事要数月时间修改模型,调整蒙皮,动画。最后的发现并不是和当初设想的一样。那么这就是严重的问题了。所以性能测试需要一个严谨的测试态度,多方面,多维度的考虑事情,切忌草率。

例如:你想象一下在相机视角内有10个带动作的3D人物模型,站在一个平面地形上。帧率只有20左右,那么你首先想到的是什么,可能很多人第一直觉是:

  • 肯定是模型的面太多了,减面就解决了。
  • 肯定是贴图太精细了,把图缩小就解决。

上面的可能不是优化性能的重点,甚至是可能是错误的方向,人物模型面数可能不能随便减少,还要看游戏品质需求,贴图2048的换成256的,你的性能真的提高了吗?
其实还可以列举一些还可能性能有影响的地方:

  • 骨骼模型节点太多了。
  • 人物IK脚本肯定有问题。
  • 人物动画可能太复杂了。
  • 环境光照,Shader等的问题。
  • 测试游戏环境问题,够不够干净。例如那个平面地形有没问题。
  • 你自己的测试环境(电脑)有没问题。
  • 等等其他类似布料,头发等因素

那么,可能接下来。
你可能又说,当然不能乱猜了,要进Profiler跑一下测试。看看到底是哪里占用消耗大。

没错,我们要理性的看待问题,到底什么在卡,我们要进入效率测试,看看到底是什么。
But,这里要注意一件及其重要的事情 - 用户对象群体

用户对象群体和性能测试

首先大家可曾遇到过这样的问题?
项目开发完了,感觉整体流畅表现不错。但是装到手机、主机等其他平台,怎么卡的动不了,或者这手感……没法玩啊……是不是天上一群马飞过,有没有类似的经历?

明明发布前性能分析过了,没什么问题。
一些人明白了过来。我去,运行平台都不同执行效率当然就不同了。

那么你用一台I7最高配的CPU,2080的显卡作为测试效率的机器,你可能看出什么?据我所知Profiler并不能自定义CPU,显卡,来测试性能。加上其他干扰 - Scene窗口的干扰,Log输出的干扰等,都会导致你测试准确性翻天覆地的不同,得到错误的结论,这些干扰因素后面再谈。

所以首先要确定用户对象群体,如果是主机游戏开发,那么简单了,配置都一样。如果是网页游戏,手机游戏,那么你就要在游戏质量上做一定取舍,或者分不同挡位去设计。

思考一个问题,如果你的开发机是最高配的CPU,用的是几年前甚至更早的集成显卡。又或者你用了一台十年前的双核心电脑开发,装的是一个还算不错的3D显卡。
在Profiler的性能显示上会出现什么情况。

前者 高配CPU,低配GPU
CPU usage 面板 可能跑到了200FPS
GPU usage 面板 可能只能到勉强的30FPS

后者 低配CPU,高配GPU
结论和前者是相反的。

不够平衡的CPU,GPU 会相互拉低你的最终FPS表现,本应当优化CPU的你优化了GPU部分,优化不理想,FPS得不到提升。
总的来说也就是说你的性能测试平台选择很重要,不能够选择性能强劲的机器和不平衡的机器来测试。

具体来说:
如果是手机游戏优化,在游戏效率优化阶段,就要找一台配置比较低端的机器(例如2核心,4核心),集成显卡,目的就是要趋近于用户低端机器配置。最然性能不高,但是得要稳定。能够和用户最低端手机性能能够对应起来。
再进行CPU,GPU的优化就能得到一个比较科学相近的数据。

还有一个办法,在BuildSetting界面里的Adutoconnet Profiler选项,程序发布后,可以透过网络方式反应到电脑的Profiler里。这也是一种性能分析方法,方便真机测试。因为是网络的,不能暂停程序,所以也又很多不便。和上面的方法相比各有利弊。

有了合适的性能分析的机器再做性能分析,准确性会更高一些。
当然并不是否定高端机来性能分析,如果只是提高和优化代码的效率也是可以的。用合理配置的机器会更加事半功倍,并且能够得到更加合理的配套解决方案。

性能优化方案和综合因素考虑

为了能让程序运行的更加效率,Unity作出了很多技术点。例如:静态烘培, drawcall动态合并,剔除,LOD,还有Quality里的各种参数,Terrain里的很多参数。目的都是为了提供挡位让低配机器能够运行,让高配机器发挥性能提高画面质量。

首先我抛出一个问题,大家思考。
地图制作需要放置 10000个模型(随便什么,桌子模型就行) ,或者更多(取决于你的电脑配置,好就多放,差就少放),相机中一眼望去要全部能看到,都在相机视野中。
当FPS降低掉60FPS以下的时候。

如此数量庞大的Mesh需要相机渲染,是很费性能的。

减面操作会影响距离相机比较近的桌子模型变的难以入目。
使用LOD ?如果10000个LOD在工作,只是那10000个LOD脚本就能让CPU耗费很大力气。也不是一种最优的方式。
还有一个办法就是模型合并,例如按照远近距离把每100个或者一个区域的桌子全部合并模型成1个模型,那么100个桌子就是一个模型,整个场景就只有100个模型了。甚至可以把桌子模型面数减少,1000个桌子一个模型。那么几乎就不存在渲染压力了,只有10个模型。

那么再根据地图距离,让远处的一片一片(合并的桌子)的显示最低模,近处的是独立的桌子,控制一个平衡点,总体的渲染数量减少了,极大降低了面数,动态drawcall负担,LOD负担,达到最优的负载。 这种可以应用在超大地图处理。要把多种优化方式综合起来一起应用才是最优化方案。

当然不同的游戏,不同的环境,优化的方案也是不同的。总有不同的最优的方案,需要我们不断的挑战和尝试。效率的优化不是一成不变的,随着Unity版本的提升,技术的变革,优化的方案方式也会渐渐的不同。

我们不能一说优化就LOD,就减面,合并Drawcall,我们需要综合考虑所有因素,制定符合游戏的优化方案。

性能测试记录工作的重要性

我们在多年游戏性能测试中发现,形成对实验数据记录是非常重要的。在早期没有这种观念,每次性能测试都有一个目标,这样的目标很简单,测试完毕后有了结论就认为可以了。
后来发现,每次都有重复的东西需要测试,或者甚至放了一段时间后,测试的结论都记忆不清楚了,又得重新测试。
举个例子:
第1次测试:人物减面,从15000减到3000,性能是怎样的?
提高了多少?提高了不少,再往下减面的话发现就不能看了,所以得出结论(当时的结论)- 只要都减到3000就行了。这时候会觉得也不用记录什么了,反正减到3000就可以了。

后来发现还是想提高承载能力,继续想办法优化。加上LOD怎么样。远处的模型给他100个面其实也看不出来。那么测试下100个面吧。
于是第二次测试开始了,从3000到100面性能提高了多少ms,15000到3000提高了多少?这时候因为没有记录无法对比了,这时候则是需要再次进行15000-3000减面的再次测试,进行对比。

后来又发现骨骼数量,蒙皮渲染器的数量等等对性能也又一定影响
那么又有测试的想法了,到底是把原来的5个蒙皮渲染器优化成1个提高的效率高,还是减少到3000面的效率高?又或者把骨骼数量从100根减少到30根提升的效率多还是减少面的提升的效率多?

游戏的优化过程总是在游戏表现和游戏性能之间取舍,我们总是想把最好的留给玩家,用最小的代价表现更丰富的游戏画面。这样复杂的测试是需要通过每一步测试要记录成详细的图文记录,或许后面又有新的优化想法,只需要在补充测试就可以了。这样的一个系统的记录,将形成一个宝贵的资料,可能半年一年后记不清楚某些性能优化点,可以翻阅测试记录来参考。否则的话你将面临一遍一遍的寻找性能优化解决方法。

早期我重复做过大量的重复的测试工作,还不是没有记录,而是记录的不够全面,例如上次结论和这次怎么又不同?是模型不同吗?忘了记录当时测试的模型是那个?截图找不到了,有截图就好了?是优化后2000面的?还是4000面的?是减少骨骼的?还是蒙皮渲染器减少的?当时的测试机器是哪台?是否换了机器,结论不一致?

所以,你想一下,测试记录重要不重要。所以需要能记录多细致就多细致,需要记录Unity版本,时间,测试模型名称,面数,骨骼,动画,环境因素(光照等),测试环境的一致性,测试机参数,甚至测试机温度,是否存在问题。
记录的全面性会让你能有一个清晰的优化思路形成方案。

最后

因时间有限,文中并没有详细的案例,只是一些经验和方法的,希望能带给你一些思考方式。
早些时候有一些测试文档和图文记录,大概几十个G,经过多次搬家更换主机也都丢失了。
如果单独为了这个博文去做用例,那可能时间太久了。
后面如果有机会系统的进行测试的工作,我会再分享一些现有的案例来具体说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity之性能分析特别篇 的相关文章

  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • Chrome devtools 配置文件火焰图中的这个差距意味着什么

    这是我的 JavaScript 代码 非常简单 console profile var count 1000 var fn1 function for var i 0 i lt count i console log THIS IS FN1
  • 如何在R中高效使用Rprof?

    我想知道是否可以从以下位置获取个人资料R 代码的方式类似于matlab的探查器 也就是说 要知道哪些行号是特别慢的 到目前为止我所取得的成绩并不令人满意 我用了Rprof为我制作一个配置文件 使用summaryRprof我得到类似以下内容
  • Perl 内存使用分析和泄漏检测?

    我用 Perl 编写了一个在 Linux 上运行的持久网络服务 不幸的是 随着它的运行 它的驻留堆栈大小 RSS 不断增长 缓慢但稳定地增长 尽管我努力清除所有不需要的哈希键并删除对对象的所有引用 否则会导致引用计数保持不变并阻碍垃圾收集
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • 使用 Visual Studio 2010 以编程方式生成 .coverage 文件

    我需要以编程方式生成 coverage 文件 这个帖子 http blogs msdn com b ms joc archive 2005 04 08 406608 aspx解释了执行此操作的 C 代码 如下所示 using System
  • java web 应用程序分析器就像这样

    阅读一篇文章http code google com p mvc mini profiler http code google com p mvc mini profiler 有没有像这样适用于 Java Web 应用程序的开源分析器 有人
  • 如何使用VisualVM获取每个函数花费的时间[重复]

    这个问题在这里已经有答案了 VisualVM 对我来说是一个很好但有点复杂的工具 我编写了一个具有许多功能的类 在 Eclipse 中 如何获取每个函数调用的次数以及执行过程中所花费的时间信息 其实很简单 运行您的程序 它将自动在 Visu
  • 附加到正在运行的进程的探查器?

    我需要一个适用于 Windows 和 Linux 的良好分析器 它们不必是同一个 针对每个操作系统的单独建议都可以 它可以附加到未以任何 特殊 方式编译的已运行进程 并给出我对进程花费大部分时间的函数进行统计 我有一些长时间运行的科学代码
  • PHP 中的远程调试和内存分析

    两个问题 我如何远程调试服务器上的 PHP 代码 目前我正在使用 var dump 检查变量的值 我如何查看服务器上远程执行特定函数需要多少内存和多少时间 对此有什么好的分析器建议吗 Note 我说的是远程位于服务器上的代码 正如其他人所说
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • silverlight 内存分析器

    您对 Silverlight 内存分析器有什么建议 想法吗 ANTS Memory Profiler 6 现在包含 Silverlight 4 分析支持 http www red gate com products ants memory
  • 当我在模型中加载数据库时,如何在 Codeigniter Profiler 中显示数据库查询?

    我的 Codeigniter 系统使用多个数据库 我不需要每个页面上的每个数据库 因此我在需要的模型中加载每个连接 然后在每个控制器中加载所需的模型 当我以这种方式加载内容时 探查器不会显示来自这些数据库的任何查询 这是我在模型中加载数据库
  • Visual Studio 2013/2015/2017 探查器在 web.config 中添加了不可发布的行?

    今天 我只是在 Instrumentation 模式下使用 Visual Studio 的分析器来分析我的 WCF 应用程序 后来我需要发布到我的网络服务器 突然我收到一条错误消息 指出找不到 Microsoft VisualStudio
  • 了解 Firebug 探查器输出

    我一直在尝试使用 Firebug 的分析器来更好地理解我们所看到的一些 JavaScript 性能问题的根源 但我对输出有点困惑 当我分析一些代码时 分析器会报告配置文件 464 323 毫秒 26 412 次调用 我怀疑 464 323
  • 如果分析器不是答案,我们还有什么其他选择?

    看完Joshua Bloch的演讲 绩效焦虑 后 我读了他在演讲中建议的论文 评估 Java 分析器的准确性 http www plan cs colorado edu klipto mytkowicz pldi10 pdf 引用结论 我们
  • C#/.NET 分析器应具有哪些功能?

    这可能是一则边缘广告 更不用说主观了 但这个问题是诚实的 在过去的两个月里 我一直在为 NET 开发一个新的开源分析器 称为 SlimTune Profiler http code google com p slimtune http co
  • 如何分析我的 python 应用程序的类方法?

    过去 我在同一个文件中编写了包含所有函数的 python 代码 并且我可以使用以下代码来分析我的程序 这是我写的装饰器 def do profile cond def resdec f if not cond return f return

随机推荐

  • CAN光纤转换器 CAN光端机在久远消防主机JB-TB-JF999-H上的应用

    火灾报警主机联网问题一直是各消防项目中的难点 特别是管廊等长距离通讯中 如何保证通讯信号长期稳定可靠的运行是需要工程重点解决的问题 而LCAN FOBR系列环网冗余式CAN光纤转换器提供二路光通道和一路CAN通道 实现CAN与光纤之间的双向
  • “文明上网”

    接下来 让我们通过一些司法案例来学习如何做到 文明上网 安全上网 吧 案例一 不听劝告沉溺网络 步步深陷堕入深渊 十四岁的韩某从小就迷恋网络 家人越是劝告越是不听 到后来甚至发展到通宵到网吧打游戏 2018年3月 因无钱上网玩游戏 韩某先后
  • ajax设置滚轮效果,用 jQuery 实现页面滚动(Scroll)效果的完美方法

    以前很多博主都写过 转载过用 jQuery 实现页面滚动 Scroll 效果的方法 但目前搜来的方法大都在 Opera 下有个小 Bug 直接用跳的而且画面闪烁 今天 超级低调的高手 Willin 共享了一种完美方法解决 jQuery 实现
  • 经典进程同步问题(三)——读者写者问题

    目录 一 问题描述 二 解题思路 2 1 读者优先算法 2 2 写者优先算法 2 3 读写公平 三 源码实现 3 1 读者优先 3 2 写者优先 3 3 读写平等 一 问题描述 一个数据问价或记录可以被多个进程共享 我们把只读该文件的进程称
  • 集成学习算法:Bagging和随机森林

    学习目标 知道Bagging集成原理 知道随机森林构造过程 知道RandomForestClassifier的使用 了解baggind集成的优点 1 Bagging集成原理 目标 把下面的圈和方块进行分类 实现过程 1 采样不同数据集 2
  • Wireshark抓包——ICMP协议分析

    内容 使用Wireshark抓包 分析较简单的数据包 环境 Windows 7 Wireshark ping是用来测试网络连通性的命令 一旦发出ping命令 主机会发出连续的测试数据包到网络中 在通常的情况下 主机会收到回应数据包 ping
  • 【Linux-GNU编译器套件(gcc/g++/gfortran)离线编译安装】

    文章目录 Linux centos7 9系统GNU编译器套件 gcc g gfortran 离线编译安装 一 GNU编译器套件定义 二 GNU GCC编译环境说明 三 GNU GCC编译安装 3 1 依赖软件包安装 3 2 gcc 7 5版
  • Hexo博文发布管理工具分享出来啦

    从此刻起 小白也能搭建自己的博客 说些什么呢 之前为朋友写的一个Hexo博客发布与管理工具 只需要点点鼠标即可实现对Hexo博文的管理 从此告别各种难记的cmd命令 赠人玫瑰 手有余香 实现功能 创建博文 修改名称 删除文章 复制 粘贴 剪
  • react函数组件

    一 函数组件 1 函数组件的创建 函数组件 使用JS的函数 或箭头函数 创建的组件称为函数组件 函数组件有如下约定 函数名称必须以大写字母开头 函数组件必须有返回值 返回JSX表达式 渲染函数组件 用函数名作为组件标签名 组件名称可以是单标
  • BGA封装扇出过孔-BGA芯片的布局布线技巧

    bga封装扇出过孔 图文并茂讲解BGA芯片的布局布线技巧 谁不言的博客 CSDN博客 因此处理BGA芯片的布局和走线已经成为工程师的必修功课 本篇文章将向大家介绍BGA芯片的布局布线技巧 BGA芯片布局的基本顺序 1 对BGA芯片进行摆放
  • 用python写一个爬虫程序,爬取百度的源码

    我可以为您提供一个简单的Python爬虫程序的示例 它可以帮助您爬取百度的源码 导入所需要的模块 import requests from bs4 import BeautifulSoup 获取百度源码 url https www baid
  • vue封装树形组件

    效果 1 组件
  • Apache Druid命令执行漏洞(CVE-2021-25646)复现

    0x00 漏洞概述 Apache Druid 是用Java编写的面向列的开源分布式数据存储 旨在快速获取大量事件数据 并在数据之上提供低延迟查询 Apache Druid 包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代
  • 硬链接和软连接的区别

    硬链接和软连接的主要区别在于 硬链接和源文件具有相同的inode节点号和block 硬链接和源文件是同一份文件 软连接和源文件的inode节点号不同 进而指向的block也不同 软连接block中存放了源文件的路径名 硬链接 源文件和硬链接
  • Postman 批量导出接口:如何快速备份你的 API

    在使用 Postman 接口测试工具时 我们可能会需要将多个接口进行导出 以备后续使用或与他人共享 下面将介绍如何使用 Postman 批量导出接口 步骤一 进入集合 首先 我们需要进入 Postman 中的集合 该集合中包含了我们需要导出
  • 数据库的部分依赖,完全依赖,传递依赖以及三种范式

    第一范式1NF 列不可再分 关系模式R都是不可分 第二范式2NF 满足完全依赖 可唯一标识一行 如主键id 消除部分依赖 如果依赖于主属性的非空真子集 那么就不满足完全依赖 要拆分成一对多的关系 第三范式3NF 不存在传递依赖 不依赖于非主
  • JSR303校验之list校验问题

    现有需求如下 新增合同时要保存补贴和费用项信息 由于都是多条 所以用list传参 但不是必传项 不传的时候不校验list中的对象 传的时候就要校验list中对象每个字段都不能为空 也就是要通过JSR303实现 当请求对象中传list 需要校
  • Springboot 多数据源配置

    Springboot 多数据源配置 前几天工作中遇到个项目说出来比较恶心 对接老系统要求一个项目连接多个数据库 Oracle Mysql SqlServer 这个时候看了一些方式写了一套多数据源常用的方式 将代码分享出来 后续会将代码整体迁
  • CSS —— 盒模型

    概念 CSS 盒模型本质上是一个盒子 盒子包裹着HTML 元素 盒子由四个属性组成 从内到外分别是 content 内容 padding 内填充 border 边框 外边距 margin 盒模型的分类 W3C 盒子模型 标准盒模型 IE盒子
  • Unity之性能分析特别篇

    Unity的性能优化大家一定很熟悉了 我在Unity4 5的时期 做过多款大型在线射击对战类网游 超大地形加载优化 对性能分析优化工作和在使用Profiler的过程中总结了一些经验 今天才有空分享出来 欢迎大家讨论 和提出不同的见解 给Un