unity3d之游戏优化

 

===============================================================================性能

美术规格:优化

一、单个蒙皮网格渲染器
二、一个模型尽量对应一个材质
三、移动平台:小于30个的骨骼 ;PC平台:大概15~60个骨骼
四、移动平台不要使用unity地形
五、模型三角面片数 :300 ~ 1500
六、静态模型:网格顶点数少于500
七、贴图大小使用256 ,使用压缩纹理模式
八、移动平台使用轻量级”移动平台”的着色器
九、移动平台:同屏面数不能超过五万,顶点数八万如下,DC控制在100之内
十、不使用阴影 不使用动态光照
十一、使用LightMaps烘培光照贴图
十二、双声道一致时能够转换成单声道
1三、资源提取减少包体积动画

===============================================================================htm

影响性能的因素:接口

CPU:
过多的Draw Calls ( DrawCall是CPU调用底层图形接口。好比有上千个物体,每个的渲染都须要去调用一次底层接口,而每一次的调用CPU都须要作不少工做,那么CPU必然不堪重负 )
复杂的脚本 ( 不重要的能够间距调用不用Update ) 或者物理模拟 ( 少用物理组件 )
频繁的GC ( GC是用来处理内存的,可是是由CPU来使用GC去处理内存,增长CPU开销 , 因此要尽可能少的触发GC )
提升代码质量 , 代码优化 ( foreach , 字符串操做 )图片

GPU:
填充率,能够简单的理解为图形处理单元每秒渲染的像素数量
像素的复杂度,好比动态阴影,光照,复杂的shader等等
几何体的复杂度 , 减小计算复杂度(减小顶点数量)
GPU的显存带宽: 压缩图片,以适应显存带宽
MipMapip

内存:
Unity3D内部内存
Mono托管内存
若干咱们本身引入的DLL或者第三方DLL所须要的内存内存

顶点处理:
过多的顶点
过多的逐顶点计算资源

像素(Fragment)处理:
过多的fragment,overdraws
过多的逐像素计算字符串

带宽:
尺寸很大且未压缩的纹理
分辨率太高的frame buffer

===============================================================================

优化技术:

顶点优化:
优化几何体
使用LOD(Level of detail)技术
使用遮挡剔除(Occlusion culling)技术

像素优化:
控制绘制顺序
警戒透明物体
减小实时光照

CPU优化:
减小Draw Calls
静态批处理 Batching static
动态批处理
利用网格的顶点数据信息 ( 合并到材质球 )
四分图或二分图
剥离A通道
减小GC ( 代码优化 )
字符串优化
循环优化
Update优化

GPU 优化:
减小绘制的数目
保持材质的数目尽量少。这使得Unity更容易进行批处理
使用纹理图集(一张大贴图里包含了不少子贴图)来代替一系列单独的小贴图。它们能够更快地被加载,具备不多的状态转换,并且批处理更友好
合并网格合并材质纹理 , 而不是合并成子网格
若是使用了纹理图集和共享材质,使用Renderer.sharedMaterial 来代替Renderer.material
使用光照纹理(lightmap)而非实时灯光
使用LOD,好处就是对那些离得远,看不清的物体的细节能够忽略
遮挡剔除(Occlusion culling)
使用mobile版的shader , 由于简单
大型场景可以使用九宫格场景切割法
优化显存带宽
压缩图片,减少显存带宽的压力。
OpenGL ES 2.0使用ETC1格式压缩等等,在打包设置那里都有
使用mipmap

内存优化:
管理好内存 , 合理释放
四分图或二分图
GC触发的两种状况:
1) 堆的内存不足时,会自动调用GC。
2) 咱们本身也能够手动的调用GC。
3) 当GC超过200B

带宽优化:
减小纹理大小
利用缩放

动画:
控制骨骼数
减小动画帧数
Animator优化

===============================================================================

关于批处理与合并

动态批处理 :
同一材质 , 知足动态批处理限制条件 , 如顶点限制等 , 便可被unity自动动态批处理
能够移动

静态批处理 :
只需勾选静态项 , unity则会进行静态批处理 , 把静态项的物体所有合并到一个网格里面 , 可是他们都是子网格 , 在这个总体的静态网格内 , 只有使用同一个材质的网格才会被批处理合并DC , 静态批处理没有限制条件 , 可是会多出一份合并网格的内存 , 静态物体不可移动

合并网格纹理集 :
以上批处理都须要知足的一个条件就是须要同一材质 , 咱们能够合并网格UV 从而使多个物体使用一个材质 , 从而批处理优化 .
状况一:
把多个网格合并UV , 而后多个网格使用一个纹理集 , 若是知足动态批处理的限制条件可不勾选静态项 , 让其动态批处理 , 若是不知足 , 则须要勾选静态项 , 让其静态批处理 , 从而优化DC

状况二:
把多个网格合并UV , 而后再把他们合并成一个网格使用一个纹理集材质 , 这样作也没有动态批处理和静态批处理( 除非场景里有多个这个合并的网格存在.. )的概念 , 由于它已经被合并成一个单网格 , 只有一个材质 , 因此也只有一个DC , 好处是不须要勾静态项 , 优化了内存 , 能够移动 , 可是不足处是增长了的包体大小 , 缘由是增长了一份合并网格的本地资源.

因此优化就要根据具体状况作出对应的取舍啦 !

相关文章
相关标签/搜索