UI变色: 修改材质和修改顶点色两种方式
1.合并DrawCall一定要是相同的材质,修改材质会将本来已合并的DrawCall分离开,就导致了DrawCall的增加及Canvas的重建。
2.修改顶点色(Button中Transition中的ColorTint方式)只会修改Canvas中的数据。
UI边框:Sliced & Fill Center
1.Sliced模式的Sprite更节省纹理尺寸。
2.中空的边框不应该勾选Fill Center,可减小Fill rate。
Mask的代价,通过Stencil buffer实现
1.移动平台需要Use 24-bit Depth Buffer(Tegra GPU 2、3上不支持,4支持)。
2.Mask中的UI元素无法与其他batch,从而增加DrawCall。
3.可以的话尝试用Filled Sprite代替。
动画:Text vs Image
1.如果Image上做了动画则Canvas需要重建,Image的顶点数一般不会很多,开销不会很大。
2.Text与文本内容(生成的网格数)相关,如果文字比较多则相比Image开销可能会翻倍。
消耗定位
1.DrawCall即为由CPU下达命令,调用OpenGL或DirectX接口进行解析并由GPU进行渲染显示的过程称为一次DrawCall。
2.在Unity中查看DrawCall参数,Window / Profiler 或者Ctrl+7 快捷键打开 Profiler性能分析器面板。
Statistics统计面板
FPS(帧数):越大越好
CPU(处理器计算速度):越低越好
render thread(渲染线程,GPU渲染所需要的时间):越低越好
Batches(渲染批次):与DrawCall关联,是Unity自动分类的渲染批次
Tris(三角面数):相机视野范围内的三角面数量
Verts(顶点数):相机视野范围内的顶点数量
SetPass calls:Unity中的Shader中包含很多Pass块,每当GPU即将去运行一个Pass块之前,就会产生一个“SetPass call”,在描述性能开销上更有说服力
资源优化
Mesh方面 :
动态模型:面片数<3000, 材质数<3, 骨骼数<50
静态模型:顶点数<500
长时间音乐(背景音乐)压缩格式:mp3
短时间音乐(攻击等等)一般不压缩存 储格式为:wav
Audio方面 :
Decompress On Load:适用于小文件
Compressed in Memory:使用于大文件
Streaming:以流的形式便加载边播放(对CPU消耗较大一般不采用)
Texture方面 :
贴图长度<1024(对手机而言)
Shader方面 :
尽量减少复杂的数学运算
尽量减少Discard操作
减少冗余资源和重复资源方面 :
1.Resources目录下的资源不管是否被引用,都会打包进安装包,不使用的资源不要放在Resources目录下
2.不同目录下的相同资源文件,如果都被引用,那么都会打包进资源包,造成冗余,保证同一个资源文件在项目中只存放在一个目录位置
LOD层级细节技术
此技术需要美工的配合,提供给程序多个不同三角面数的模型。在场景中新建一个空的游戏物体,并添加LOD Group组件并将美工提供的三种不同精度的模型按照精度的大小依次拖入到LOD0、LOD1、LOD2中,此时,场景中渲染显示的模型会根据相机与模型的距离进行切换显示,具体的切换显示距离可拖动组件中的条形框大小进行自定义,这样便达到了近处渲染精模,远处渲染粗模甚至不渲染来减少GPU消耗的目的
OcclusionCulling遮挡剔除技术
当场景中有大量模型需要渲染时,应用遮挡剔除可实现减少DrawCall提升性能的效果,首先选中所有需要进行遮挡剔除的模型,并设置其occluder(遮挡体)和occludee(被遮挡体),有的物体可以是遮挡体同时也是被遮挡体。接下来Window / Occlusion Culling 打开遮挡剔除面板选中遮挡剔除选项,烘焙完成后,设置好显示视野的相机。
Lightmapping光照贴图技术
首先将需要进行光照贴图的游戏物体设置为Lightmap Static,其次将用于光照贴图的所有光源设置为Baked模式,最后Window / Lighting 打开灯光面板,进行烘焙。其中Build后会在当前场景所在的文件夹中生成一个光照贴图文件,我们也可以点击Clear Baked Data 按钮进行光照贴图的清理操作,之后无论场景中的光源是否激活,均显示光照效果。
Mesh合并
当场景中模型非常多,不妨试一下模型合并技术,可以在3dMax或其他建模软件上进行操作,也可在Unity中进行操作,这里我仅介绍Unity中的模型合并方法。前提:合并的物体必须是相同的材质,否则合并之后赋值多个材质并不能起到优化作用。首先,将下述代码放在Assets / Editor 文件夹下,其次,在场景中需要合并的模型放在一个空物体下,然后,点击选中空物体并点击上方的菜单栏按钮MeshCombine / CombineChildren进行合并所有子物体Mesh,最后,自行更改模型中的材质,位置等参数即可。
资源池的利用(缓存池)
当有游戏物体需要频繁的创建删除的时候,不妨试试资源池,可以节约性能。例子:射击游戏中的子弹
最头疼的问题 : Drawcall
UGUI会自动检测优化,如果多个材质间没有遮挡或只有小部分不影响的遮挡则会合并DrawCall为一个
1.尽可能保证Text在Image的上方。字体的DrawCall就可能自动会优化。
2.尽可能保证Image之间不存在不必要的重叠。
Canvas的重建主要就是为了合并DrawCall,可以将有动画的文字放在单独的Canvas中去,手动分离DrawCall(增加DrawCall)后就不会再要去跟别的文字作合并,该Canvas就不需要再重建故减少了重建开销。
尽可能使用缓冲池。如人物身上的伤害数字,生成时会有较大的开销因为有Mesh的生成等过程。
尽阿能比减少Den lr—的量10焻设备上建议不超D10。威少的方法主要有如下几种:Frusum oulig , oco so lalng, letuePachng.,fustumc.lig是Lrity内建的,我扪们需要做的就是寻求一个合适的远裁善评平面;o0ctsinc lig,瞠图胡族除,,titv办的1Umbra, 一个非常好0C库。但oc son oilnag供并不是救之四海而皆准的,有时候进行C反而比不进行还要慢,建议在C之前先确定自己的场景是否适合利用OC来优化:TexturePating,或者训latue Aising,是将同软tsve的理进行拼合,根租 L ty的ctatctetnhng的特也来威)d aw d l建议收使用,但也有弊赏,那联是一定要将场景中距商相近的实体纹理进行拼合,否则,拼合后很可能会增加每帧渲染所需的纹理大小,加大内存带宽的负担。这也就是为什么会出现“DrawCall降了,渲染速度也变慢了”的原因。
Unty (或者说基体所有团形引掌)生城—次更面的处理边程大时到可以过祥能化墩达·引弹先经过简的可见点凯财。“碗定国射门阿以慢到的众、。然目延时冬纳的顶点 (包捶本地2面、法铁该U筒),索(低救明限议主身好例),鼓胖(是锐的放量披持、‘皱致、以及握狲凯位量到),刘铁光理、绒理,准染方式(油就商( t der完定)等数退路备好,点后通知亚杂AP/…或者制简的看保是傲和GFIU—开始给说制,G的V基于这丝教惯,经过一系到运算。在屏需上医出斑杆千上万的三角形,最终构h—幅图像。
在hit中,每次好摩指备数并通CP的道推的为一次Dnenw l,这一边据是个将比进行的,对于年个然壮。不只GU的读续。引李董新没土质[ t he也是一以球常和的躁作,因此司的Dea (l.知,是一项排螳里郪的性能指行。对于10味的应尽量控制在20次以内,这个值可以在编辑器的Statistic窗口看到.
Uhity内y置了Dra l athing技术、,从名,守就可以看出,它的主要目标就是在一7/Dnaw (a 件微量处理多个物体。只要称的变换甜材质泪明手,G沼残喷可以坡完全部的按试进行5理,可以是的做在一个: (re、Dal l ltre校利的救数就是在可见性测肢之后,杜查轿有要绘制的物体的材质,把相同材质的分为一组(一个Bach,然后把它们组合成一个初体(统一变换),这样就可以在一个Draw (al中处强多个彻体了《(实际士是组合后的一个精体),
EDraw (l :thigF在一个晚换,就是它需要况一个Eatchr的所有期体组合到一起,相于创键7一个与这丝飞体加旭缺袂一大的格体,与此司时新震要分药祖加大)的存。这不仅会销牦多内样,还需要哨耗(7V时月。特执是们于移的然体,每-帧都得重新进行组合,这就需要进行一些权衡,否则得不偿失。但对于静止不动的物体来说,只需要进行一次组合,之后就可以一直使用,效率要高得多。
Unty提供了Dynamic Batching和Static Batching两种方式。Dynamic Batching是完全自动进行的,不需要也无法进行任何千预,对于顶点数在300以内的可移动物体
只要使用相同的材质,就会组成Batch。Static Batching则需要把静止的物体标记为
Static,然后无论大小,都会组成Batch。如前文所说,Static Batching显然比Dynamic Batching要高效得多,于是,Static Batching功能是收费的..
要有效利和Or n (l atcing,首尤是5量成场景中健的材做效显,即尽虽共享土辰,时于仅城道不同的就族可以相被理组合到一最大的的理中 《税为leture tiasng) 。n预h是把不会合多政的体玩E动认ct tc。 此外还可以通〔comineloider法本(Stadrd Asset/Scrtsutit scptsCcomtineCtidren)手动把幼体组合在一起,但这个御本会影1响可见住测减。因为组合在一起的幼体始终会校看作一个物体,从而会增加GPU要处理的几何体数量,因此要小心使积.
对于复杂的静态场景,还可以考虑自行设计遮挡剔除算法,减少可见的物体数量同时也可以减少Draw Call。
总之,理解Draw Call和Draw Call Batching原理,根据场景特点设计相应的方案来尽量减少Draw Call次数才是王道,其它方面亦然。