搜索Unity

Asa关于着色性能分析和优化的技巧

以下是Asa Reed的一些最佳技巧:如何顶点或片元着色器与外部工具之间做出选择,以及最后最重要的七点优化技巧。

顶点或片元着色器:选择哪一个?

顶点着色器:如果您最关心性能,那么顶点着色器可能是最佳选择。顶点着色器作用于网格的每个顶点,而片元作色器则作用于这些顶点构成的三角形中的每个像素。

顶点着色器有一些局限性:无法获得准确的光照数据或在顶点着色器中执行纹理贴图。但是,通过顶点着色器可以对任意数量的uv纹理坐标进行偏移(例如,为了获得一种动画化表面效果),而片元着色器则无法实现。

Unity-shader-optimization-vertex-shader

使用顶点着色器的一个模型示例,从顶点到片元着色器示例.

顶点着色器中的光照和表面效果常常运行速度更快,但是会导致更低的视觉质量/保真度。特别定向几何体(顶点)的任何操作应始终在顶点着色器中执行,例如,GPU蒙皮。

片元着色器:如果您的目标是打造高端视觉效果或引人关注的表面效果,需要平滑和正确的光照,则不妨考虑使用片元着色器。请密切注意添加到片元着色器的操作,并尽可能简化这些操作或将其移到顶点着色器。

Unity-shader-optimization-vertex-and-fragment-shaders

使用顶点和片元着色器的同一模型,从顶点到片元着色器示例.

在Unity中,请特别注意,任何#pragma都会在着色器代码中定义或使用Unity的内置功能。当您仅仅执行修改Alpha值之类的简单操作时,虽然您可能认为您的着色器不会消耗太多资源,但如果同一着色器定义“#pragma surface surf BlinnPhong”,则会将几十个计算注入着色器中,以便计算Blinn-Phong光照。通过查看Unity安装目录中的lighting.cginc文件,您可以看到这些光照定义添加的代码。有关更多信息,请查看文档表面着色器中的自定义光照模型.

着色器性能分析

Unity的Frame debugger将正在运行的游戏的播放状态冻结到特定帧,并查看用于渲染该帧的各个绘制调用。除了列出绘制调用,调试器还可逐个单步执行这些调用,以便您详细查看场景是如何从场景的图形元素构建的。

Unity-shader-optimization-frame-debugger

Unity帧调试器

在2017.1中,我们还包含了关于几何体批处理的信息,并提供了将特定网格体设置为进行批处理时,它不进行批处理的原因的具体反馈。

在特定硬件上,还有非常优秀的外部工具可用于着色器调试:

  1. 对于iOS和Mac OS:Xcode有一款优秀的内置帧性能分析器,其中包括一些选项,例如,capturing,用于捕捉GPU在特定帧中使用的所有内存;camera.render,用于获取绘制代码的重点,并深入查看绘制对象的嵌套层级视图;FPS选项卡,用于显式每个着色器如何影响总渲染时间。

    Unity-shader-optimization-xcode_profiler

    Xcode的帧性能分析器。

  2. 在PC和Mac上,RenderDoc和Intel GPA工具最了解同时也最可能实现最佳硬件兼容性。

  3. 对特定硬件目标的性能或不正确的输入进行调试时(如ARM Mali等移动芯片组、PS4、Xbox、Nintendo Switch等),请始终使用制造商自己的帧调试器(有时称为帧性能分析器或帧分析器)。他们的工具几乎总是可以为自己的芯片组得出最准确的数据,并且与上述更通用的工具相比,它们很可能有扩展的数据集。

七个关键着色器优化

对于每个帧,着色器代码需要完成的工作往往比游戏代码多得多。请尝试以下优化技巧,帮助您确保平滑优秀的性能/FPS帧速率。

  1. 减少执行非常量数学运算。使用常量或“动态一致”(例如,x=4/33、x=4xsin(24))。
  2. 先乘以标量值(float, int),再乘以向量值(float3, float4)。
  3. 只要可能,避免丢弃指令,包括AlphaTest(主要适用于移动平台)。注意过度绘制。
  4. 如果可能,保持在顶点着色器上计算。
  5. 只要可能,为向量运算指定写掩码(如果它不使用结果的所有组分)。
  6. 避免根据动态设置值/非一致(if-else、loops)分支。
  7. 检查渲染模型(OpenGL 2、OpenGL 3、OpenGL ES等)和硬件上运算的影响(如discard()、floor()等)。
更多资源

着色器文档和教程:

您喜欢本文吗?请告诉我们!

喜欢。继续发送 还行。有待改进
明白了

我们使用Cookie来确保在我们的网站上为您提供最佳体验。有关更多信息,请访问我们的Cookie政策页面