@TOC


前言

刚进公司,需要学开发需要的新框架及现成框架,完成自己的需求。那么在此期间,遇到新东西,就可以以此为基础,学习新语言新框架新工具…,总结一下,以供后面参考学习,查看。肯定大家都有一定差异啦,大家作为参考哦,与诸君共勉。
[工欲善其事,必先看点书嘛,看啥书呢?](https://aiminminai.gitee.io/aiminminai/categories/%E6%B8%B8%E6%88%8F/%E6%B8%B8%E6%88%8F%E5%BC%95%E6%93%8E/Unity%E7%9A%84%E5%A4%A7%E6%A6%82%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF-%E8%A6%81%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%96%B0%E4%B8%9C%E8%A5%BF%E9%83%BD%E6%9C%89%E4%BB%80%E4%B9%88/)
[游戏中的关卡?主角?怪物?,学名是啥](https://aiminminai.gitee.io/aiminminai/categories/%E6%B8%B8%E6%88%8F/%E6%B8%B8%E6%88%8F%E5%BC%95%E6%93%8E/Unity%E4%B8%AD-%E5%9C%BA%E6%99%AFScene%E3%80%81%E6%B8%B8%E6%88%8F%E5%AF%B9%E8%B1%A1GameObject%E3%80%81%E7%BB%84%E4%BB%B6Component-%E4%BB%8B%E7%BB%8D/)

一、渲染管线:图形数据在GPU上经过运算处理最后输出到屏幕的过程【插件:InstantOC:】

1.内部组件:

  • 分为上下两部分,也就是CPU工作区和GPU工作区
    • 上半部分:游戏—>图形API
    • 下半部分:图形API–>CPU与GPU的分界线—>顶点处理—>图元装配—>光栅化—>像素处理—>缓存

2.内部实现逻辑

- CPU会对游戏中的物体进行初步判断,看哪些物体需要被渲染。视锥以内【Color Mask也选择的是No】,CPU判断需要渲染,就会把物体交给Unity的图形API,此时看你的发布平台是Window还是移动端,Window就是DX,移动端就是OpenGL,图形API把这个物体再交给显卡,然后要被渲染的物体各自准备一下自己的数据,逐次交给GPU,每个物体需要绘制,那么每个物体都会产生自己的Draw Call【重要的优化指标】,绘制调用Draw Call,指的是每次引擎准备数据并通知GPU的过程,通俗来说,绘制调用Draw Call指的是每帧调用显卡渲染物体的次数,一个物体一次嘛,有多少物体就调用多少次Draw Call对物体进行渲染,Draw Call越大说明要渲染的物体越多嘛,渲染管线走的次数就越多,性能就越差,所以我们要减少Draw Call。
    - Draw Call在Unity5中对应Batches,有光照就比较复杂,有光照就不是一个物体一个Draw Call
        - 绘制调用 Draw Call: 每次引警准备数据并通知GPU的过程。通俗讲,每顿调用显卡渲染物体的次数。
        - 物体多了占存,渲染多了就会导致Draw Call多了,进而通知GPU的次数和引擎准备数据的次数就多了,只要要显示CPU就得准备数据,这个过程也就多了
    - 假设有两辆车,第一辆车的车尾和第二辆车的车头重复了,怎么知道该渲染哪一辆车,这就要取决于两个物体的深度信息,用深度信息来进行选择,深度值远了就不着色了,远的渲染了屏不就花了
- 显卡【GPU】进行顶点处理,接收模型顶点数据,任何的模型都是由任意个三角形组成的。显卡需要接收顶点坐标及其他类型的数据,CPU初步选择哪些物体需要渲染,然后把需要渲染的物体对应的顶点数据,坐标、三角形数等信息,收集好,把数据交给GPU。GPU再进行坐标系转换,将点转到屏幕坐标中。
- 然后顶点处理完成,进行图元装配,连接相邻的顶点,绘制为三角面,组成面
- 然后进行光栅化【格越小越多,越清晰】,计算三角形上的像素【像素越高越清楚】,并为后面着色阶段提供合理的插值参数
- 然后进行像素处理,对每个像素区域进行着色【上颜色】,并写入缓存中
    - 不能一个面着色好就给显卡,一个面做好,放到缓存中,缓冲一下,等每个面都做好,交给显卡输出到屏幕
    - 一个存储像素数据的内存块最重要的缓存是帧缓存与深度缓存。
        - 帧缓存:存储每个像素的色彩,即渲染后的图像。缓存常常在显存中,显卡不断读取并输出到屏幕中。
        - 深度缓存 z-buffer:存储像素的深度信息,即物体到摄像机的距离。光栅化时便计算各像素的深度值,如果新的深度值比现有值更近,则像素颜色被写到帧缓存,并替换深度缓存。
    - <font color='red'> 一大堆像素点,GPU收集到了这些点之后,这些点都是在自身坐标系中,哪些顶点在哪些位置,取这些顶点时需要将这些点的坐标转换到屏幕坐标中,转换之后要进行连线,组面,然后可以根据LOD、遮挡剔除等记性内存占比等指标的优化 </font>

二.优化方法:如何优化,不就是减少Draw Call

1.即时遮挡剔除【剔除被挡住的】:即时遮挡剔除Instant Occlusion Culling

  • 遮挡剔除:当物体被送进渲染流水线之前,将摄像机视角内看不到的物体进行剔除,从而减少了每帧渲染数据量提高渲染性能。可以用插件InstantOC【遮挡剔除有很多种实现方式】
    • 用法可以看官方手册
    • 剔除物体就是把物体的Mesh Render不勾选,物体就看不见了【也算是遮挡剔除的优点,Draw Call少了】
      • 遮挡剔除缺点,判断物体是否被遮挡,导致CPU有额外的开销
      • 什么时候用遮挡剔除,当场景中物体分布较为密集,存在着一大堆被遮挡的物体,量大密集,用遮挡剔除,要是有俩被遮了其他都是没被遮的,就不要用啦
    • 剔除就是,常用的属性,如:射线检测物体外边的绿框框,不检测物体的顶点啥的,因为绿框框少呀,检测方便

2.LOD

  • LOD,【Levels of Detail】,多细节层次,如果游戏中一个人物很真,那么就说明模型三角形的面很多,顶点数很多,模型很精细。LOD级数指根据物体模型【三角形】的节点,在显示环境中所处的位置等,决定物体渲染的资源分配,如果你这个物体离摄像机很远,那么我就没必要给这个物体很多的三角形面的顶点,给很多不就是浪费嘛,因为你离摄像机很远本来就很模糊呀,你再设置很多面和顶点还是模糊,浪费面和顶点,都是模糊,还不如就给很少的面和顶点就行,所以此时用LOD来降低非重要物体的面数和细节度,从而优化程序【减少Draw Call,Draw Call少了,那么引擎准备数据和通知GPT的次数就少了,不就优化了嘛】,获得高效率的渲染运算。
    • LOD缺点:LOD使用,需要在Hierarchy中创建Lod_0、Lod_1…,很占内存,有很多多余的精模型、粗模型…,优点:场景中存在精面模型,存在距离变化时,可用LOD进行优化。

3.[性能优化从哪几个方面入手,Unity工具中有个性能检测器Profiler,里面有几个优化性能参数的角度:CPU Usage]

  • CPU Usage
    • Rendering
    • Scripts
    • Physics
    • GarbageCollector
    • VSync
    • Gi
    • Others
  • Rendering
    • Batches
    • SetPass Calls
    • Triangles
    • Vertices
  • Memorym
    • Total Allocated
    • Texture Memory
    • Mesh Memory
    • Material Count
    • Object Count
    • Total GC Allocated
    • GC Allocated

三:光照和声音[能看见物体,肯定是有哪种光在照射这种物体]

  • 光照系统。GI,指全局光照,能够计算直接光、间接光、环境光及反射光的光照系统。通过GI算法可以使渲染出来的光照效果更为真实丰富,比如没有全局光照肯呢个就是全黑的,没有那种渐变的真实的色彩感觉。
  • 间接光,很耗费性能,因为需要计算每个物体的位置。所以必须用这个间接光时需要提前在开发阶段,把物体标记为静态,工作量交给编译器
    • 间接光,很耗费性能,因为需要计算每个物体的位置。所以必须用这个间接光时需要提前在开发阶段,把物体标记为静态,工作量交给编译器
  • 直接光照:
    • 从光源直接发出的光,通过Light组件实现
    • Type 类型: 灯光对象的当前类型
      • Directional Light 平行光:平行发射光线,可以照射场景里所有物体,用于模拟太阳。
      • Point Light 点光源:在灯光位置上向四周发射光线,可以照射其范围内的所有对象,用于模拟灯泡。
      • Spot Light 聚光灯:在灯光位置上向圆锥区域内发射光线,只有在这个区域内的物体才会受到光线照射,用于模拟探照灯。
      • Area Light区域光:由一个面向一个方向发射光线,只照射该区域内物体,仅烘焙时有效,用在光线较为集中的区域
      • Range 范围:光从物体的中心发射的范围。仅适用于点光源和聚光灯
      • Color 颜色 : 光线的颜色
  • 环境光照
    • 作用于场景内所有物体的光照,通过Environment Lightin中Ambient 控制。
    • Ambient Source 环境光源
      • Skybox 通过天空盒颜色设置环境光照
      • Gradient 梯度颜色:Sky 天空颜色、Equator 地平线颜色、Ground 地面颜色
      • Ambient Color 纯色
      • Ambient Intensity 环境光强度
      • Ambient GI 环境光GI模式
        • Realtime实时更新,环境光源会改变选择此项
        • Backed 烘焙,环境光源不会改变选择此项
  • 反射光照
    • 根据天空盒或立方体贴图计算的作用于所有物体的反射效果,通过Environment Lighting 中 Reflection 控制。
    • Reflection Source 反射源
      • Skybox天空盒
    • Resolution 分辨率 Compression 是否压缩
      • Custom 自定义
    • Cubemap 立方体贴图
    • Reflection Intensity 反射强度,Reflection Bounces 使用 Reflection Probe 后允许不同游戏对象间来回反弹的次数。
  • 阴影,投影,影子,Shadow Type可以在Unity中选择,有No Shadows、Hard Shadows和Soft Shadows三种选择。
    • 光可以选择阴影,个别物体可以选择投不投射或者说接不接收,还可以设置阴影距离
  • 实时GI,Realtime GI
    • 所谓“实时”是指在运行期间任意修改光源,而所有的变化可以立即更新。
    • 正是由于 Unity 5引入了行业领先的实时全局光照技术,Enlighten 系统,才可以在运行时产生间接光照,使场景更为真实丰富。
      • 操作步骤:
        • 1.游戏对象设置为 Liahtmapina Static
        • 2.启用 Lighting 面板的 Precomputed Realtime GI
        • 3.点击Build按钮(如果勾选 Auto 编辑器会自动检测场景的改动修复光照效果)
  • General Gl
    • 常规GI设置,同时适用于实时GI与烘焙GI.
    • 于游用的贴图,PC端才用烘焙
  • 光源侦测 Light Probes
    • 由于LightMapping只能作用卡static物体,所以导致运动的物体与场景中的光线无法融合在一起,显得非常不真实而Light Probes组件可以通过Probe收集光影信息,然后对运动物体邻近的几个Probe进行插值运算,最后将光照作用到物体上。
  • 烘焙 GI [烘焙很消耗性能]
    • 烘焙 Lightmap
      • 当场景包含大量物体时实时光照和阴影对游戏性能有很大影响。使用烘焙技术可以将光线效果预渲染成贴图再作用到物体上模拟光影从而提高性能。适用于在性能较低的设备上运行的程序
    • 所以实时预览很困难,难实现
    • 烘焙只针对场景中不动的静态的物体
    • 动态的,你就不能勾选烘焙,那这个动态的物体就不参与烘焙了
  • Unity支持的音频文件格式:
    • mp3 , ogg , wav , aif , mod , it , s3m , xm.
    • 声音分为2D、3D两类
      • 3D声音: 有空间感,近大远小
        • 3D Sound Settings
          • Volume Rolloff 音量衰减方式
          • Min Distance 开始衰减距离
      • 2D声音: 适合背景音乐。
    • 在场景中产生声音,主要依靠两个重要组件:
      • Audio Listener 音频监听器:接收场景中音频源AudioSource发出的声音,通过计算机的扬声器播放声音。
      • Audio Source 音频源
        • Audio Clip 音频剪辑:需要播放的音频资源
        • Mute 静音:如果启用,播放频没有声音
        • Play On Awake 唤醒播放:勾选后场景启动时自动播放
          -…

巨人的肩膀

  • 周志明老师的凤凰架构
  • C#高级编程
  • C#函数式编程
  • 叩响C#之门