【Unity】Unity中影响性能的几个因素
影响性能的因素
首先,我们得了解,影响游戏性能的因素哪些,才能对症下药。对于一个游戏来说,有两种主要的计算资源:CPU和GPU。它们会互相合作,来让我们的游戏可以在预期的帧率和分辨率下工作。CPU负责其中的帧率,GPU主要负责分辨率相关的一些东西。
总结起来,主要的性能瓶颈在于:
- CPU
- 过多的Draw Calls
- 复杂的脚本或者物理模拟
- 顶点处理
- 过多的顶点
- 过多的逐顶点计算
- 像素(Fragment)处理
- 过多的fragment,overdraws
- 过多的逐像素计算
- 带宽
- 尺寸很大且未压缩的纹理
- 分辨率过高的framebuffer
对于CPU来说,限制它的主要是游戏中的Draw Calls。那么什么是Draw Call呢?如果你学过OpenGL,那么你一定还记得在每次绘图前,我们都需要先准备好顶点数据(位置、法线、颜色、纹理坐标等),然后调用一系列API把它们放到GPU可以访问到的指定位置,最后,我们需要调用_glDraw*命令,来告诉GPU,“嘿,我把东西都准备好了,你个懒家伙赶紧出来干活(渲染)吧!”。而调用_glDraw*命令的时候,就是一次Draw Call。那么为什么Draw Call会成为性能瓶颈呢(而且是CPU的瓶颈)?上面说到过,我们想要绘制图像时,就一定需要调用Draw Call。例如,一个场景里有水有树,我们渲染水的时候使用的是一个material以及一个shader,但渲染树的时候就需要一个完全不同的material和shader,那么就需要CPU重新准备顶点数据、重新设置shader,而这种工作实际是非常耗时的。如果场景中,每一个物体都使用不同的material、不同的纹理,那么就会产生太多Draw Call,影响帧率,游戏性能就会下降。当然,这里说得很简单,更详细的请自行谷歌。其他CPU的性能瓶颈还有物理、布料模拟、粒子模拟等,都是计算量很大的操作。
而对于GPU来说,它负责整个渲染流水线。它会从处理CPU传递过来的模型数据开始,进行Vertex Shader、Fragment Shader等一系列工作,最后输出屏幕上的每个像素。因此它的性能瓶颈可能和需要处理的顶点数目的、屏幕分辨率、显存等因素有关。总体包含了顶点和像素两方面的性能瓶颈。在像素处理中,最常见的性能瓶颈之一是overdraw。Overdraw指的是,我们可能对屏幕上的像素绘制了多次。
了解了上面基本的内容后,下面涉及到的优化技术有:
- 顶点优化
- 优化几何体
- 使用LOD(Level of detail)技术
- 使用遮挡剔除(Occlusion culling)技术
- 像素优化
- 控制绘制顺序
- 警惕透明物体
- 减少实时光照
- CPU优化
- 减少Draw Calls
- 带宽优化
- 减少纹理大小
- 利用缩放
使用LOD(Level of detail)技术
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
控制绘制顺序
减少实时光照
![](/assets/blank.gif)
使用Lightmaps
使用God Rays
减少Draw Calls
批处理(Batching)
![](/assets/blank.gif)
![](/assets/blank.gif)
- 顶点属性的最大限制为900,而且未来有可能会变。不要依赖这个数据。
- 一般来说,那么所有对象都必须需要使用同一个缩放尺度(可以是(1, 1, 1)、(1, 2, 3)、(1.5, 1.4, 1.3)等等,但必须都一样)。但如果是非统一缩放(即每个维度的缩放尺度不一样,例如(1, 2, 1)),那么如果所有的物体都使用不同的非统一缩放也是可以批处理的。这个要求很怪异,为什么批处理会和缩放有关呢?这和Unity背后的技术有关系,有兴趣的可以自行谷歌,比如这里。
- 使用lightmap的物体不会批处理。多passes的shader会中断批处理。接受实时阴影的物体也不会批处理。
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
- 尽可能选择静态批处理,但得时刻小心对内存的消耗。
- 如果无法进行静态批处理,而要使用动态批处理的话,那么请小心上面提到的各种注意事项。例如:
- 尽可能让这样的物体少并且尽可能让这些物体包含少量的顶点属性。
- 不要使用统一缩放,或者都使用不同的非统一缩放。
- 对于游戏中的小道具,例如可以捡拾的金币等,可以使用动态批处理。
- 对于包含动画的这类物体,我们无法全部使用静态批处理,但其中如果有不动的部分,可以把这部分标识成“Static”。
合并纹理(Atlas)
利用网格的顶点数据
减少纹理大小
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
利用缩放
【Unity】Unity中影响性能的几个因素相关推荐
- java优化上传速度慢怎么办_网站建设中影响网站优化的一些因素
一个网站建设的后期运营,要想网站能够有更好的排名.有更多的流量.有更好的推广效果,那么对网站进行优化是必不可少的一件事情.所以企业开始对网站优化越来越重视,那么在网站制作过程中应该考虑哪些因素对网站优 ...
- SEO优化中影响网站关键词排名的因素有哪些?
网站在进行优化的过程中,关键词排名一直都是优化师比较关心的.网站的排名以及能否上搜索引擎首页也跟关键词有着很大的关系,关键词也成了最直观最可考证执行成果,也变成企业网络推广的一种竞争方式,成为人们较为 ...
- union all会影响性能吗_哪些因素会影响悬臂式掘进机的性能?
悬臂式掘进机性能的好坏是决定快速掘进的关键,已有成果的基础上,对影响悬臂式掘进机性能的主要因素进行了综合分析.下面小编就具体说明一下: 1.截割头.截齿的影响因素 截齿是掘进机的关键部件,其材料和制造 ...
- 淘宝中影响产品SEO权重的因素有哪些?
店铺权重包括:宝贝权重,人气权重,店铺权重,其他因素. 那么宝贝权重呢?说白了就是宝贝的展现. 宝贝的展现提高的另一种描述,或者说与之挂钩的就是宝贝的加权因素.那么加权的因素有哪些? 1.销量权重:排 ...
- mysql中影响数据库性能的因素讲解
mysql中影响数据库性能的因素讲解 在本篇文章中我们给大家讲述了mysql中影响性能的因素以及相关知识点内容,有兴趣的朋友参考下 关于数据库性能的故事 面试时多多少少会讲到数据库上的事情," ...
- 怎么在unity中测试游戏_Unity中的性能基准测试:如何开始
怎么在unity中测试游戏 As a Unity developer, you want your users to love playing your games, enjoying a smoot ...
- 如何提高Unity Gear VR游戏性能
教你如何提高Unity Gear VR游戏性能 跟马赛克说拜拜 虚拟现实场景 好的,所以你决定用 Unity 来做一个 VR 游戏,并选定了三星 Gear VR 为你的目标平台.做好之后,打开应用,在 ...
- luajit集成篇/平台相关篇 | 合理用好lua+unity,更省性能的方案整理
luajit集成篇 大家都知道luajit比原生lua快,快在jit这三个字上. 但实际情况是,luajit的行为十分复杂.尤其jit并不是一个简单的把代码翻译成机器码的机制,背后有很多会影响性能的因 ...
- Unity 3D 中的专业“术语表”。
这是unity手册中的内容.具体可以参考此链接:Unity 用户手册 (2019.4 LTS) - Unity 手册 目录 2D 术语 2D 物理术语 AI 术语 Analytics 术语 动画术语 ...
最新文章
- 新一代服务器和解决方案齐发力 推动虚拟化进程(一)
- android往天气接口里面传城市,Android使用中国天气网API数据通过城市名称获取天气情况...
- inittab脚本启动解析 (zz)
- ASP.NET使用Memcached高缓存实例(初级教程)
- LeetCode 807. 保持城市天际线
- Java基本数据类型及其包装类
- Hadoop对小文件的解决方案
- HTML5实践 -- 可伸缩的mobile搜索框
- atitit.sql server2008导出导入数据库大的表格文件... oracle mysql
- 计算机照片无法删除吗,在win10电脑删除不了图片怎么办
- 小米浏览器禁用java_小米手机调试总出现“INSTALL_CANCELED_BY_USER”
- 聚类算法-密度聚类算法DBSCAN
- [PKUWC2018] Minimax
- 激活ltsb2016_WIN10 LTSB 2016电话激活步骤详解
- 用户画像第二章(企业级360°用户画像_数据调研及ETL)
- [英语语法]词法之动词:时态语态
- Maya---倒角命令
- 关于ios XCode hangs at Attaching to (app name)
- Win7系统卸载McAfee杀毒软件
- ObjecARX实现对圆图极坐标展开获得方图