UPL9-5——减少曲面细分
UPL9-5——减少曲面细分 曲面细分 在图形渲染中,曲面细分是把一个较粗的网格(低多边形)自动拆分成更多的小三角形,形成更平滑的几何表面 比如: 一张四边形面,可以被细分成 4、16、64 个小面片 这样视觉上更圆润,但会大幅增加顶点数量和三角形数量 一般通过曲面细分着色器来实现这样的功能,在对美术表现要求高的游戏中才会使用的技术 当你有以下这些需求时,才会考虑使用曲面细分着色器 高端画质、近景特写 需要真实几何表现而不是靠法线带来的视觉假象 大规模环境 曲面细分对 GPU 的性能影响 在GPU渲染管线中,曲面细分会增加多种负担 顶点处理压力增加 每细分一次,顶点数成倍增长 GPU 顶点着色器、几何阶段需要处理更多数据 片元(像素)处理间接增加 更多的三角形,意味着更密集的覆盖像素,意味着片元着色器嗲用次数会上升 内存带宽开销上升 顶点数据(坐标、法线、UV、权重等)需要传输,细分越多,显存到 GPU 核心的数据带宽消耗越大 缓存效率下降 GPU...
UPL9-4——遮挡剔除
UPL9-4——遮挡剔除 遮挡剔除 Unity 默认只会进行视锥剔除,即摄像机视锥外的物体不会渲染, 但是在视锥内,被其他物体挡住的东西仍然会被渲染,而遮挡剔除就是用来弥补这一点的 遮挡剔除(Occlusion Culling)的作用: 让被遮挡,不可见的物体不再进入渲染管线 减少 DrawCall,顶点处理,像素填充 等开销 提升性能,尤其是在室内场景,城市场景,森林 这种遮挡很多的环境 比如:玩家在一个房间里,外面的街道模型其实完全看不到,没有必要渲染他们 如果没有遮挡剔除,这些在摄像机视锥范围内的对象依然会被送进 GPU 渲染,浪费性能 说人话:遮挡剔除弥补了视锥剔除的局限性,让 Unity 可以剔除那些在摄像机视锥内,但是被挡住的对象,这样可以节约 GPU 渲染性能 遮挡剔除的具体内容可见:遮挡剔除 - Unity 手册 遮挡剔除的作用 设置需要使用遮挡剔除的对象为遮挡静态对象 会遮挡别人的物体(比如建筑、墙体、山体等)——> 设置为 Occluder Static(静态遮挡物) 可能被遮挡的物体(比如角色、家具、树木等)——> 设置为...
UPL9-3——LOD
UPL9-3——LOD LOD LOD(Level of Detail,细节层次) LOD 的核心目的:减少远处物体的几何复杂度(顶点,三角形数量),降低 GPU 顶点处理压力,让场景在视觉上几乎无损的前提下提升性能 具体好处包括: 提升性能 远处的物体在屏幕上只占很少像素,用高模浪费算力,LOD 可以替换成低模,让 GPU 处理更轻松 节省显存和带宽 高模 → 低模 → Billboard 加载和显存压力逐步减轻 兼顾画质与性能 近处依旧报错高质量,远处用简化版本,玩家几乎察觉不到 说人话:LOD 的主要作用就是动态平衡画质和性能 LOD 的使用 Unity 提供了 LOD Group 组件来管理 LOD 使用步骤: 准备好模型 让美术输出同一个物体的多个精度版本模型(如 LOD0、LOD1、LOD2) 或者使用 Mesh Simplification(网格简化算法)工具自动生成低精度模型 创建一个空物体,添加 LOD Group 组件,将多个精度版本模型作为其子对象 对 LOD Group...
UPL9-2——降低几何复杂度
UPL9-2——降低几何复杂度 为什么要降低几何复杂度 降低几何复杂度的主要目的是 减轻 GPU 与 CPU 在几何处理阶段的负担 减轻 内存带宽 压力和 显存 压力 等等 从GPU角度 GPU 渲染管线的第一步就是处理顶点, 如果场景里有几百万甚至上千万个顶点,GPU 必须逐个变换(模型矩阵、光照计算、蒙皮等), 负担会极大,可能带来: 帧率下降 移动端功耗升高、发热严重 顶点带宽不足导致 GPU 卡顿 等等 因此,降低几何复杂度,相当于直接减少了顶点着色器的工作量 从 CPU 角度 每个网格渲染之前,CPU 要把网格数据提交给 GPU(DrawCall), 如果模型过于复杂(高面数、网格碎片多),则会导致 CPU 消耗在渲染准备工作上,挤占逻辑、物理计算上的时间 因此,降低几何复杂度,可以间接减少 CPU...
UPL9-1——GPU Skinning
UPL9-1——GPU Skinning GPU Skinning GPU Skinning(GPU 蒙皮)是 Unity 中提供给我们的一个功能开关 可以在 Project Settings ——> Player ——> Other Settings ——> GPU Skinning 中进行设置 它的设置 决定了 角色动画(带 Skinned Mesh Renderer 蒙皮网格渲染器的对象)里顶点随骨骼运动的变形计算 在 GPU 还是 CPU 中进行 GPU Skinning 的三种模式 CPU 所有蒙皮运算都在 CPU 中完成,完成后,CPU 把最终的顶点位置传给 GPU 这种方式虽然兼容性好,但是 CPU 压力很大,大量角色存在时可能导致 CPU 成为瓶颈 GPU CPU 只算部分内容,比如骨骼矩阵,顶点变形由 GPU 顶点着色器来做 这种方式可以大幅减少 CPU 运算和数据传输 GPU 会对每个模型单独计算蒙皮,如果 DrawCall 较高,会带来一定开销 GPU (Batched) GPU Skinning 的批处理版本,Unity...
UPL9——增强渲染性能
UPL9——增强渲染性能 GPU Skinning 降低几何复杂度 LOD 遮挡剔除 减少曲面细分 优化 UI 系统 更多的 Canvas 组件 禁用 Raycast Target 禁用 Canvas(画布)组件,避免使用 Animator 为世界空间画布定义摄像机 不要使用透明度组件隐藏组件 优化 ScrollRect 使用 UIText 进行全屏交互 更多方案 优化粒子系统 着色器优化 降低计算量 减少采样开销 降低填充率压力 阴影质量 光照烘焙 光照探针 反射探针 善用 GPU 并行特性 Compute Shader 优化移动端渲染性能
UPL8——影响 GPU 性能的主要因素
UPL8——影响 GPU 性能的主要因素 影响 GPU 性能的主要因素 在开发时注意这些优化点,可以减少性能问题的发生 当发生性能问题时 先定位问题,再针对性解决问题 结合性能分析窗口、帧调试窗口来分析定位问题,不要凭感觉 填充率 填充率(Fill Rate)是 GPU 的一个性能指标,是最经典的衡量图形处理器片元阶段吞吐能力的指标之一 表示 GPU 在单位时间内能处理(写入)的像素数量 一般用 像素 / 秒 (Pixels per Second,GPixel/s = 十亿像素/秒,MPixel/s = 百万像素每秒) 来衡量 相当于填充率决定了每帧能处理多少个像素 假设 RTX4090 GPU 的理论填充率为 450 Gpixel/s = 4500 亿像素/s 一个 60 FPS的游戏,每帧该 GPU 理论上能处理 4500亿 / 60 = 75亿像素 即 每帧可以处理 75 亿 个片元 如果是一个4K显示器 3840 × 2160 ≈ 829 万个像素 每个像素只处理一次的话 理论上来说,RTX4090 可以每帧处理 4K 画面 75亿 / 829万 ≈...
UPL7-8——碰撞检测相关
UPL7-8——碰撞检测相关 合理利用碰撞层矩阵设置 想要减小碰撞检测带来的开销,根本上就是要减少碰撞候选对的产生 所谓的 候选对 就是指,在广义检测 / 粗检测(Broadphase)阶段得到的一组可能相交的物体对 产生的候选对越多,在下一步进行 狭义检测 / 精检测(Narrowphase)的工作量就越大,CPU 压力就越大 因此,我们应该尽量避免无意义的碰撞产生,最有效直接的方式就是利用碰撞层矩阵 让无关层(相互之间不需要发生碰撞检测的层)全部互斥,这样可以大幅减少候选对的产生,从而达到优化性能的目的 利用 Physics 公共类 API 单独忽略物体碰撞 有时可能通过 碰撞层矩阵 不太好进行碰撞忽略,比如处于某两层中的物体,并不是所有都不需要碰撞检测,而只希望个别忽略 举例: 角色丢出的手榴弹,不要和自己身上的 Collider 撞到 近战武器的 Collider 要忽略和角色自身的 Collider 的碰撞 等等 如果只是想控制个别对象之间的碰撞检测忽略,我们可以利用物理公共类中的忽略碰撞方法 1234class Physics{ public...
UPL7-7——刚体相关
UPL7-7——刚体相关 知识回顾:碰撞体、刚体、运动学刚体、碰撞检测类型 详细可见:U1L13——物理系统碰撞体相关 碰撞体: 对于不移动的物体,但是需要和物理对象产生碰撞的物体 只需要加碰撞体组件,因为它不需要有受力表现,只希望阻挡其他物理对象 我们一般称只带有碰撞器的对象为 静态碰撞体 刚体: 要移动,并且需要有物理受力表现的物体,需要添加碰撞器和刚体 我们一般称带刚体和碰撞器的对象为 动态碰撞体 运动学刚体: 刚体上勾选了 是运动学的(Is Kinematic)选项的刚体称为运动学刚体 它的作用类似 静态碰撞体 的效果,即与其它对象产生碰撞时,自身不会有力作用表现 好处是我们可以利用刚体相关 API 让其移动,由于运动学刚体对象不会对撞击它的对象做出物理反应 它在运行时会简单的把其他动态碰撞器推开,因此,有时我们会在某些类型的游戏中将玩家对象设置为运动学刚体 碰撞检测类型(Collision Detection): Discrete(离散检测) 原理:每个物体只在 固定物理步长的采样点...
UPL7-6——避免复杂碰撞体类型
UPL7-6——避免复杂碰撞体类型 碰撞器性能消耗排行 如果我们将 Unity 提供给我们的自带碰撞器进行性能消耗排行,那么得到的结果是这样的(前面的消耗更低,后面的消耗更高) 球体(Sphere Collider) 最省性能,因为数学公式简单,适合用于子弹、角色感知范围、球类等 胶囊体(Capsule Collider) 稍比球复杂,但依旧是数学公式计算,常用于角色、NPC 碰撞体 盒体(Box Collide) 稍微复杂一点,但仍然是矩阵与边界检测,性能非常高,场景里使用最广泛,比如地板、墙壁、方形物体 组合碰撞体(由多个原始碰撞体(Sphere、Box、Capsule)拼接) 开销比单一原始体略高,但仍远低于 网格碰撞器(Mesh Collider) 轮子碰撞体(WheelCollider) 它的本质不是网格求交,主要开销来自于垂直射线检测和摩擦、扭矩、制动相关的计算 地形碰撞体(Terrain Collider) 专门为地形系统优化的特殊碰撞器,内部使用高度图数据,而不是逐三角面,在大规模场景中比 Mesh Collider...
