关于unity:URP管线修改落地实战

114次阅读

共计 2986 个字符,预计需要花费 8 分钟才能阅读完成。

URP 作为最近越来越多的新我的项目开始应用的管线,到很多老我的项目开始进行降级,很多人会遇到各种问题,比方为什么降级到了 URP,性能并没有变得更好,甚至在低端机上还降落了?GrabTexture 机制没有了,怎么做扭曲成果?想用线性空间但 UI 色彩不对怎么办?URP 为什么值得降级?等等。

文章会从我的项目制作的角度,从根底性能批改动手,到我的项目层面一些刚需批改,来教会大家如何批改 URP 管线,从而达到本人想要的目标和成果。文章适宜能看懂代码的技术美术,源码之下,了无机密!

阐明:本课程次要对 URP 管线在我的项目中的理论利用落地进行解说和实现(附带代码可无效运行在 Unity 2021.3.4f1 版本上,URP 版本为 12.1.7,但每个我的项目须要自行了解整合应用)。

作者苏晟晖是资深客户端程序,我的项目渲染负责人。2006 年毕业,曾工作于 SEGA,KONAMI,制作过实况足球,也做过端游 MOBA,参加过 MLBB 和 MLA。


目录

1|前言
2|身边实用的工具
3|外围代码的简略了解
4|实战 - 批改 Camera 的附加数据(示例中有具体实现代码)
5|实战 - 线性空间与伽马空间共存(示例中有具体实现代码)
6|实战 - 以 Volume 的形式增加后处理(示例中有具体实现代码)
7|不额定减少 Camera 实现扭曲成果(代码中不附带)
8|分辨率拆散的做法和优劣(FSR)(代码中不附带)


本篇转载自《URP 管线批改落地实战》的第 1 - 3 节。

1|前言

本课程次要对 URP 管线在我的项目中的理论利用落地进行解说和实现(附带代码可无效运行在 Unity 2021.3.4f1 版本上,URP 版本为 12.1.7,但每个我的项目须要自行了解整合应用)。

URP 作为最近越来越多的新我的项目开始应用的管线,到很多老我的项目开始进行降级,让很多人遇到了各种问题,比方为什么降级到了 URP,性能并没有变的更好,甚至在低端机上还降落了?GrabTexture 没有了,怎么做扭曲成果?想用线性空间但 UI 色彩不对怎么办?URP 为什么值得降级? 等等。

就以上问题,兴许你能够从上面的内容取得答案:

  1. 实用的工具
  2. 外围代码的简略了解
  3. 裁减 UniversalAdditionalCameraData
  4. 线性空间和伽马空间共存(UI 的 Atlas,文字等)
  5. 以 Volume 的形式增加后处理
  6. 不额定减少 Camera 实现扭曲成果(Grab)
  7. 分辨率拆散的做法和优劣(FSR)

将来有新的值得记录的内容也会持续更新。


2|身边实用的工具

工欲善其事,必先利其器。咱们想要用好 URP,或者说改好 URP,上面两个工具,咱们肯定要把握好。

1. Frame Debugger
Unity 自从提供了 Frame Debugger 之后,管线调整以及问题追述都比之前不便和明确很多。

咱们通过上图(右边)能够看到,场景里有 2 个 Camera,他们别离用了什么管线配置,以及绘制的程序和内容,并且在点选单项后,能够看到绘制的具体内容和数据(左边)。

右边的每一项,在 UniversalRenderer.cs 里都是一个 Pass,倡议学习的时候先在代码里把每个 Pass 对应的内容都先相熟,这样有利于之后对管线进行批改(援用某人的一句话:源码之下无机密,看源码这事,不能偷懒)。

由此可见,咱们能够通过 Frame Debugger 来确认咱们批改代码后冀望的渲染程序,渲染内容,渲染后果是否正确,所以,在咱们批改了管线的代码后,肯定要在这里确认无误。

2. XCode
从项目组角度来说,咱们应用 XCode 来进行调试通常是在我的项目中后期,对于很多半路被砍掉的我的项目来说,兴许基本没有机会应用 XCode 就曾经被砍了,但这里我想倡议一下,有条件的团队能够早一些应用 XCode 来编译我的项目,iOS 的环境更有利于确认管线的性能和正确性。

咱们用 XCode 在手机上运行游戏时,在 Options 页面,将 GPU Frame Capture 设置为 Metal,同时勾选下方 Profile GPU Trace after capture。

而后在运行时,将右边的按钮切换到小瓶子按钮上,就能够看到 App 的相干性能数据。

咱们点击下方 M 这个按键时,就会截取以后 Frame 的所有信息,咱们能够通过截帧的信息,看到咱们管线的渲染流程,以及每个 Pass 的耗费。

通过这些内容,咱们能够很不便地晓得哪些 Pass 的耗费太大,须要优化,哪些管线做法设计的不合理,须要优化。

更多具体内容可自行应用 XCode 钻研。


3|外围代码的简略了解

源码之下无机密,肯定肯定肯定(重要的事说三遍)要花工夫看一遍源码,如果全副源码看不了,起码看一下各个 Pass 和总管文件 UniversalRenderer 的实现。

这里对外围的代码做一下简略的介绍,不便之后的内容了解:

1. 管线代码文件:UniversalRenderPipeline.cs

protected override void Render(ScriptableRenderContext renderContext, List<Camera> cameras)

这个函数外面,会执行每个 Camera 的 UniversalRenderer 内的 Pass,如此一来,咱们就能够在每个 Camera 进行绘制之前,先进行一个小判断,从而来扭转 Camera 外部绘制的流程。

2. 外围向渲染代码:UniversalRenderer.cs
这个代码里定义了所有管线流程中会应用的 Pass。

咱们须要创立额定的 RT,也能够在 CreateCameraRenderTarget 函数里创立,相似下图:

3. 管线更换!= 性能降级
有遇到不少敌人把 Built-in 管线降级到 URP,而后发现低配性能升高了,其实应用 URP 不意味着降级了就算实现了,咱们还须要对管线进行定制优化。

这里为了之后的内容便于了解,先简略解释一些点。

一些须要了解的点:
a. 因为咱们在 Editor 下,除了 GameView 以外,还有 SceneView,其中 GameView 走的是失常的 Camera 渲染流程(也就是说,理论有几个 Camera,就会有什么样对应的管线解决),而 SceneView 用的是独立 Camera,所以咱们在批改管线的时候,须要思考同步解决 SceneView 内的渲染成果,代码里能够用 cameraData.isSceneViewCamera 的值来做判断,辨别代码失效的渲染窗口,也能够防止批改管线带来编辑窗口和运行窗口成果的不对立(但在同时反对伽马空间和线性空间之后,SceneView 确实有个取舍的成果不统一的问题)。

b. 咱们批改管线,须要思考到 Editor 没有 Play 的状况,以及 Play 的状况,因为还有半路创立 Camera 的状况(比方 UI 的 Camera 是用逻辑创立的,而非带在启动 Scene 内),这些都会影响到团队内其他人在关上我的项目的状况下看到的画面。

c. 一旦开始批改管线,倡议从整体上进行思考,尽量不要只思考繁多性能在管线中的实现,而疏忽了管线自身的承前启后的性能。


以上就是《URP 管线批改落地实战》的第 1 - 3 节,此篇文章比拟适宜从事 Unity 开发的技术美术人员;心愿晋升批改 URP 管线能力,零碎了解 URP 管线落地办法的以及对 Unity 的 URP 渲染感兴趣的同学的读者。

读完全篇后你会对 URP 管线有更深的了解,并理解管线批改落地的办法,课程还提供了配套工程和大部分课程内的实现代码,有助于咱们自行钻研。

正文完
 0