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管线有更深的了解,并理解管线批改落地的办法,课程还提供了配套工程和大部分课程内的实现代码,有助于咱们自行钻研。