Unity优化之CPU与GPU

游戏的图形部分主要影响计算机的两个系统:CPU 和 GPU。找到性能问题所在是一切优化的首要法则,因为 GPU 与 CPU 的优化策略大不相同(甚至相反;例如,通常在优化 CPU 时让 GPU 做更多工作,反之亦然)。
所以在做优化之前我们应该知道在每一帧中CPU和GPU为我们做了什么。
cpu要为 确定哪些光源影响该对象,设置着色器和着色器参数,向图形驱动程序发送绘制命令,而图形驱动程序随后将准备发送到显卡的命令。

1,CPU收集即将被渲染的对象信息,并把这些信息分类为渲染指令(也称为draw calls命令)。一个draw call包含网格数据以及网格如何被渲染。在某些场景,共享设置的一些对象可能会被合并为一个draw call。合并不同对象的数据到同一个draw call被称作batching。CPU给每个draw call渲染指令创建一个数据包,称为batch数据包。每一个batch必须包含一个draw call。
2,CPU会发出指令,使GPU改变一些渲染状态。这个指令被称为SetPass call。SetPass call通知GPU,如何去渲染下一个网格。
3,CPU把draw call渲染指令发送给GPU。draw call渲染指令通知GPU使用最近的SetPass call去渲染指定的网格。
4,有时,数据包batch可能包含不止一个的pass(pass是shader代码的一部分,新的pass需要改变渲染状态)。对于数据包batch中的每个pass,CPU必须发送一个新的SetPass call,然后必须要再次发送draw call渲染指令。
5,GPU按照CPU发送的指令顺序处理这些指令。
6,如果当前任务是SetPass call,那么GPU更新渲染状态。
7,如果当前任务是draw call渲染指令,那么GPU渲染网格。渲染网格发生在很多阶段,不同阶段的shader代码可以定义渲染。其中:顶点着色器vertex shader告诉GPU怎么处理网格的顶点。片元着色器fragment shader告诉GPU怎么绘制单独的像素。
8,以上过程会重复执行,直到这一帧中所有CPU发送的任务都被GPU完成。

针对cpu的优化,常见瓶颈及检查方法:

GPU 通常受填充率或内存带宽制约。
降低显示分辨率并运行游戏。如果显示分辨率降低后游戏运行更快,表明 GPU 填充率可能是限制因素。
CPU 通常受到需要渲染的批次数的限制。
检查 Rendering Statistics 窗口中的“batches”。渲染的批次越多,CPU 成本越高。

不太常见的瓶颈:

GPU 有太多顶点需要处理。可接受的能确保良好性能的顶点数量取决于 GPU 和顶点着色器的复杂程度。一般来说,移动端应不超过 100,000 个顶点。另一方面,即使有数百万个顶点,PC 也能管理到位,不过最好还是通过优化尽可能减少此数量。
CPU 有太多顶点需要处理。这些顶点可能位于蒙皮网格、布料模拟、粒子或其他游戏对象和网格中。如上所述,通常较好的做法是在不影响游戏质量的情况下尽可能降低此数量。有关如何执行此类操作的指导,请参阅下面有关 CPU 优化的部分。
如果渲染在 GPU 或 CPU 方面不是问题,则可能在其他地方存在问题,例如在脚本或物理系统中。请使用 Unity Profiler 找出问题。

使用 OnDemandRendering 进行 CPU 优化

在以下情况下,可能需要降低帧率:
菜单,例如应用程序入口点或暂停菜单。菜单往往是相对简单的场景,不需要全速渲染。可以使用较低的帧率来渲染菜单,从而降低功耗并防止设备温度升高到可能调节 CPU 频率的程度。
回合制游戏,例如国际象棋。玩家花时间等待其他用户行动或者玩家思考自己的行动。在活动较低的时间段中,可以降低帧率以防止不必要的功耗并延长电池续航时间。
内容在大多数时间内是静态的应用程序(如汽车 UI)。
调整渲染速度有助于管理功耗和设备散热,从而最大限度延长电池续航时间并防止 CPU 调速。这一点特定适合于 Adaptive Performance 包。即使帧的渲染频率不高,应用程序仍会以正常速度将事件发送到脚本(例如,应用程序可能会在未渲染的帧期间接收输入)。为了防止输入滞后,可以在输入持续时间内调用 OnDemandRendering.renderFrameInterval = 1,以便移动、按钮等仍可迅速响应。
如果脚本、物理、动画等方面工作量巨大,但渲染量并不大,此时使用这一 API 作用不大。应用程序的视觉效果可能会卡顿,对功耗的影响最小。
注意:VR 应用程序不支持按需渲染 (On Demand Rendering)。如果不渲染每一帧,则会导致视觉效果与头部移动不同步,并可能增加晕动症的风险。

减少渲染数量
1,手动减少数量
2,使用遮挡剔除
3,调整摄像机的摄像机Clipping Planes

减少渲染的批次数
1,使用烘焙,在游戏中,实时的光照、阴影、反射可以极大的提升观感,但这些操作需要耗费极高的性能。
2,进行动态合批处理
3,开启Shader的Enable GPU Instancing功能,用于减少渲染大量相同物体时的DrawCall

物理组件
物理组件很消耗cpu,能不用的情况下尽量不用,非要用的话那 也没办法不是

GPU的优化
1,减少绘制数目
1.1 开启Shader的Enable GPU Instancing功能
1.2 使用纹理图集
1.3 使用LOD(但会提高内存占有)
1.4 遮挡剔除
1.5 减少面数,定点数
2,减少显存带宽
2.1 图片压缩
2.2 Mipmap

你可能感兴趣的:(C#,Unity3D,Unity,unity,unity3d,游戏)