图形引擎实战:手游URP渲染管线升级 经验分享

为大家介绍一下我们的Crossous同学在搜狐畅游引擎部的一些学习成长心得,请看他的分享:


加入到畅游引擎部大家庭已接近两年,大多数工作是解决渲染问题,实现图形效果,优化游戏性能。在开发和实践过程中,掌握URP渲染管线,学到了更多图形渲染在工程中的技术与应用,也获得了将计算机和图形学理论落实于项目的实战经验。

2020年底,引擎组做了性能比对,以同样规模场景渲染作为样本,对比BuildIn管线和URP管线渲染效率差距,确定URP管线渲染效率更高,开始迁移管线。

首先要做到迁移前后效果一致,修改BuildIn Shader到URP Shader,常用后处理用URP自带的Volume;自定义的渲染效果,用URP的RendererFeature实现,例如BuildIn下的GrabPass抓屏操作,URP管线下,如果需要带有半透物体的颜色Buffer,就需要手动拷贝。

URP下的GrabPass方案

随着需求的增加,简单修改RendererFeature可能无法实现,或者实现性能不够好,再或者不易于使用。例如URP7.3.1版本Bloom的升降采样Pass特别多;FXAA是在CameraStack最后一个相机渲染后做,导致UI抗锯齿后特别模糊;需要主相机RT和UI相机RT不同分辨率渲染;URP中还有每帧的渲染GC和一些BUG。在解决上述问题的过程中,逐渐熟悉的URP的源码架构,对项目的管线了如指掌,当出现渲染问题时,可以很快定位并解决,也可以根据需求修改和定制管线。

URP后处理 自定义Volume方式

在效果上,维护场景TOD组件,给场景集成天气、雾、水面交互等效果。角色增加次表面散射效果;在维护自阴影效果中,角色的投影视锥体需要美术指定大小,感觉流程不易于使用,于是设计了一个通过角色包围盒与相机包围盒计算自适应投影视锥的算法。

实现效果后也开始考虑优化。例如游戏在手机上经常崩溃,Profile后发现内存占用过高,需要着手减少内存占用,于是检查纹理压缩格式、读写、mipmap,编写工具批量处理项目中设置不正确的纹理;理顺Shader变体收集、剔除流程;检查不合理的RT占用;检查内存泄露等。对于渲染,检查管线,去掉多余的Clear、Blit;控制变体数量,更好的利用SRP Batch优化;Alpha-Test物体利用Perpass和DepthTestEqual减少Alpha-Test物体渲染时Early-Z失效带来的性能损失。优化和调试的工作中,熟悉了Unity Profile、Memory Profile、FrameDebug、UPR、PerfDog、RenderDoc、SnapDragon、UWA等Profile、Debug工具的使用。

Unity手游项目优化记录

当自己实现的图形Feature落入游戏中,使游戏效果更出色,在我看来,这是最令人开心的时刻。

文:Crossous

欢迎加入我们!

感兴趣的同学可以在官网投递简历:

内推码:NTAI1kh

引擎校招:搜狐畅游 - 校园招聘

引擎实习:搜狐畅游 - 校园招聘

TA校招:搜狐畅游 - 校园招聘

TA实习:搜狐畅游 - 校园招聘


版权声明:本文为qq_41166022原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。