zoukankan      html  css  js  c++  java
  • SIKI_UNITY_3_进阶_性能优化全攻略

    Unity性能优化全攻略

    任务3:游戏安装包大

    很多情况下,使用Unity打包的游戏安装包会比使用本地API开发的安装包大,原因是Unity制作的游戏是跨平台的,这个跨平台是基于Mono的(游戏基于Mono,通过Mono与操作系统进行交互),因此Mono本身占有了一定空间。

    任务4:DrawCall

    https://zhuanlan.zhihu.com/p/26386905

    DrawCall -- 绘制调用 -- CPU对图形绘制接口的调用 --
      CPU通过调用图形库(DirectX/OpenGL)接口,这些接口会与GPU进行交互,命令GPU进行渲染操作)
      (详):CPU通知GPU发出一个glDrawElements(OpenGL图源渲染函数)或DrawIndexedPrimitive(DirectX顶点绘制方法)的过程称为一次DrawCall.
      与GPU的渲染相关 -- DrawCall越大,表示性能消耗越大

    为什么反而是CPU性能瓶颈呢 -- CPU在进行DrawCall之前还需进行很多准备:检测渲染状态、提交渲染所需数据、提交渲染所需状态
      DrawCall过多时,CPU需要很多额外开销用于准备工作,负载高而GPU本身由于强大的计算能力很快完成渲染任务而闲置了

    优化思路:减少DrawCall数量

    把很多小的DrawCall合并到一个大的DrawCall中 -- 批处理
    在CPU和RAM中合并网格,但合并网格本身需要消耗性能且创建新网格需要占用内存。因此批处理的频次不宜太高

    合并的网格会在同一次渲染任务中进行绘制 -- 合并条件为:同材质、同贴图、同shader,网格顶点格式最好也一致

    避免使用过多材质,可共享材质

    由于合并有消耗,因此尽量在编辑器下合并;

    需要在运行时合并的,将静态物体和动态物体分开合并:静态合并一次即可;动态物体变化时需要重新合并

    https://www.zhihu.com/question/36357893

    任务6:Statistics统计面板

    https://blog.csdn.net/wdmzjzlym/article/details/51335915

    Rendering Statistics Window 

    FPS: Frame Per Second -- 帧率 -- 每秒渲染的帧数 -- Unity中该数值仅包括此游戏Scene中渲染的帧(不包括编辑器中绘制的)

    Render Thread -- GPU渲染线程处理图像所花费的时间

    Batches -- 即Batched Draw Calls,为Unity内置的Draw Call Batching优化技术。
      引擎对一个物体进行一次DrawCall时会产生一个Batch,这个Batch包含了该物体所有的网格和顶点数据(猜测为Tris/ Verts)
      当渲染另一个相同的物体时,引擎会直接调用上述Batch中的信息并送至GPU,使得渲染过程更加高效
      -- Batching技术即将所有材质相同的物体进行合并渲染

    而对于含不同Shader和Material的多个物体,在渲染时会产生多个Batches,因此渲染的过程比较耗时
    而且每次对于物体的材质或者贴图进行修改都会影响Batches里数据集的构成

    与Batches相关的优化:
      即使Unity自带Draw Call Batching技术,也可以通过手动方式合并
      尽量不要修改Batches中物体的scale,会导致生成新的batch
      尽可能在一个物体上使用较少的材质,以减少batches
      对于场景中禁止的物体,可以设置static属性,被标为static的物体会自动进行内部批处理优化

    Tris -- 三角面数 -- 摄像机视野(Field of View)内所渲染的三角面总数量

    Verts -- 顶点数 -- 摄像机视野内渲染的顶点总数量

    Unity不会把模型拆分,如果有一个模型的一个顶点需要渲染,Unity也会把整个模型都渲染出来

    空场景下Statistics面板上显示有1.7k Tris和5.0k Verts,原因是空场景自带天空盒需要渲染。
      Windows->Rendering->Lighting Settings->Scene中将Skybox的材质设为空后,得到的为Tris = 2; Verts = 4; 
      若将摄像机删除,Tris = Verts = 0;

    Screen -- 当前Game视图分辨率大小,3.9MB表示显示所占内存

    SetPass Calls -- 需要结合Shader进行讨论:一个物体的shader为了实现效果,可能会包含很多Pass
      每当GPU即将运行一个Pass之前,就会产生一个SetPass Call

    用draw call描述渲染性能的不可取处:每一个DrawCall是CPU发送给GPU的一个渲染请求,该请求中包含渲染对象的顶点、三角面、索引、图元个数等,该请求不会消耗过多,真正消耗渲染资源的是在GPU得到请求指令后把指令发送给对应物体shader,让shader读取指令并通知相应渲染通道(Pass)进行渲染操作

    用Batches描述渲染性能的不可取处:多个需要渲染的物体如果有一样的材质、shader,则会被batching机制自动合并成一个batch。因此batches只能反映场景中需要进行批处理的数量

    Shadow Casters -- 表示场景中有多少个可以投射阴影的物体,一般这些物体都作为场景中的光源

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    云时代架构阅读笔记十一——分布式架构中数据一致性常见的几个问题
    云时代架构阅读笔记十——支付宝架构师眼中的高并发架构
    云时代架构阅读笔记九——Disruptor无锁框架为啥这么快
    云时代架构阅读笔记八——JVM性能调优
    lightoj 1024 (高精度乘单精度)
    lightoj 1023
    lightoj 1022
    codeforces 260 div2 C题
    codeforces 260 div2 B题
    codedorces 260 div2 A题
  • 原文地址:https://www.cnblogs.com/FudgeBear/p/12790622.html
Copyright © 2011-2022 走看看