zoukankan      html  css  js  c++  java
  • unity3d之游戏优化

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

    美术规格:

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

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

    影响性能的因素:

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

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

    内存:
    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 , 好处是不需要勾静态项 , 优化了内存 , 可以移动 , 但是不足处是增加了的包体大小 , 原因是增加了一份合并网格的本地资源.

    所以优化就要根据具体情况做出对应的取舍啦 !

  • 相关阅读:
    Tomcat下bootstrap启动分析
    Ubuntu读取/root/.profile时发现错误:mesg:ttyname fa
    【转载】Activiti delete process definition by key
    Ubuntu16解锁root
    Activiti源码:ActivitiEventSupport类中eventListeners的设计
    [转载] Activiti Tenant Id 字段释疑
    Linux下使用NTFS格式移动硬盘
    Linux dd命令制作U盘启动盘
    Activiti源码:StandaloneInMemProcessEngineConfiguration与SpringProcessEngineConfiguration
    Activiti源码学习:ExecutionListener与TaskListener的区别
  • 原文地址:https://www.cnblogs.com/ninomiya/p/8037329.html
Copyright © 2011-2022 走看看