美文网首页
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