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

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

  • 相关阅读:
    数据类型装换
    变量及数据类型
    27 网络通信协议 udp tcp
    26 socket简单操作
    26 socket简单操作
    14 内置函数 递归 二分法查找
    15 装饰器 开闭原则 代参装饰器 多个装饰器同一函数应用
    12 生成器和生成器函数以及各种推导式
    13 内置函数 匿名函数 eval,exec,compile
    10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量
  • 原文地址:https://www.cnblogs.com/ninomiya/p/8037329.html
Copyright © 2020-2023  润新知