美文网首页
Unity性能优化

Unity性能优化

作者: 一剑卿心 | 来源:发表于2018-10-19 10:47 被阅读35次

    https://www.jianshu.com/p/3b285110069f
    https://blog.csdn.net/e295166319/article/details/79107399《第16章 Unity中的渲染优化技术》

    • 角色模型面数:一个角色移动平台一般300 ~ 1500面,PC平台一般1500~ 4000面。

    • 模型骨骼数:一般不多于30个骨骼


      https://docs.unity3d.com/Manual/ModelingOptimizedCharacters.html
    • Draw Call计算公式
      http://www.cnblogs.com/zhaoqingqing/p/4623839.html
      在来谈到 Batch,其实也是 Draw Call 的另一种称呼。你可以想成每一次的 Draw Call 会产生一个 Batch,而 Batch 里装的是物件顶点信息,Batch 由 CPU 通过 “驱动程序” 将顶点信息送往 GPU,GPU接手后将物件画在画面上。由此可知,越多 Draw Call,CPU 就越忙碌。这下更清楚知道 Draw Call 数量所影响的是 CPU 效能而非 GPU。
      NVIDIA 在 GDC 曾提出,25K batchs/sec 会吃满 1GHz 的 CPU,100% 的使用率。所以他们推出了一条公式,来预估游戏中大概可以 Run 多少个 Batch:

      Draw Call计算公式
      Draw Calls = 25K * GHzcpu * Percentcpu / FrameRate ;
      举个例子:如果你的目标是游戏跑30FPS、使用2GHz的CPU、20%的工作量发給Draw Call來使用,那你每秒可以有多少Draw Call呢?
      333 Batchs/Frame = 25K * 2 * 20% / 30 .

    性能优化最直观的目标是提升帧率,帧率可以理解为我们常说的刷新率,通常用FPS表示,即游戏每秒钟的刷新次数Frames per second.

    用几个数字大致了解性能优化的目标:

    • FPS = 1/ T ; T为每帧游戏消耗的CPU时间。
      通常比较理想的帧率为60,相应地,一帧的CPU的时间为T=1/60=0.016秒;
    • 苹果A11处理器最高时钟频率大约为 2.5 GHz,其运行速度为每秒6000亿次浮点计算,0.6T FLOPS(float point operation per second)。
      以帧率60计算,A11处理器的运算次数为每帧不超过6000亿/60=100亿次计算。
    • 如果将应用程序的一次指令集调用视为一次计算,可以理解为应用程序的Update中的函数语句调用次数不超过100亿次。
    • 应用程序或者说游戏的一次Update到底有哪些事情在处理?

    一次Update的工作:
    逻辑+渲染


    资源优化标准
    Mesh动态模型:

    • 面片数<3000
    • 材质数<3
    • 骨骼数<50
      静态模型:
    • 顶点数<500
      Texture贴图:
    • 长宽<1024
      音乐资源优化
    • Audio长时间音乐(背景音乐)压缩格式 mp3
    • 短时间音乐(音效)非压缩格式 wav
      Shader
    • 尽量减少复杂数学运算、
    • 减少discard操作


    一、 Draw Call batching
    https://docs.unity3d.com/Manual/DrawCallBatching.html
    绘制调用合并,主要有static batching(合并渲染批次)、dynacmic batching、instancing(实例渲染)
    Unity内置的批次合并,首先要求要合并的物体使用同一个材质。
    1 static batching:静态批次合并
    静态批次合并,是指Unity可以将静止并且材质相同的物体合并为一个巨大的mesh来渲染。

    • 将游戏对象设置为静态。
    • 使用同一个材质。只有使用同一材质的物体才可能被合并。因而,如果想要获得好的合并效果,要尽可能多的让不同的物件模型共用同一个材质。
    • 纹理打包。如果有两个材质球,使用的Shader相同,仅仅是贴图不同,可以考虑合并这些贴图到一个大的贴图里,这个过程叫做图集打包——Texture atlasing。一旦这些贴图在一个图集里,就可以将这两个材质,用一个材质球代替。

    2 dynamic batching:动态批处理

    3 GPU Instancing:多实例渲染

    GPU Instancing

    https://www.cnblogs.com/88999660/p/5541695.html
    在Unity中用手动方式降低Draw Call

    如果我们想减少draw call,在Unity中或者在其他引擎上,可以尽量减少使用的material(材质)。基本上,这些可以还原为这些简单的步骤:
    1.整理所有的material并且通过他们的shader类型收集他们
    2.第二步:对于使用相同shader的材质,将他们的贴图做成一个图集(Atlas)
    3.创建一个material,它将包含shader和图集(Atlas)
    4.网格的所有UV重新映射,使用Shader适配图集的坐标
    5.用映射的网格创建出步骤3的material


    二、LOD
    Levels of Detail的简称,意为细节层次。
    三、Occlusion Culling
    遮挡剔除,Culling Distance。

    角色模型
    针对角色模型

    1. 角色模型
    关闭光照探头、
    关闭反射探头、
    关闭接收阴影、一般效果要求开启投射阴影,但是接收应该没有必要开启,视情况而定
    
    

    VBO(顶点缓冲对象Vertex Buffer Objects-是让APP存储和操作GPU内存中数据的一种机制,当GPU处理数据时,不需要从CPU内存中读取,可以节约内存带宽) Total的值是207.2KB,这与场景里没放物体207.2KB一样大小,这说明了动态批处理不仅优化了CPU的DC,还有优化了Memory(内存)大小!


    影响因子:
    1.光照

    • 光照方程:


      图片引用:https://www.jianshu.com/p/2e73fbee0d62
    • 光照方程的加标示版本:


      图片引用:https://www.jianshu.com/p/2e73fbee0d62
    • 阴影

    1. 雾气

    2. LOD

    相关文章

      网友评论

          本文标题:Unity性能优化

          本文链接:https://www.haomeiwen.com/subject/cvrrzftx.html