抖音开放平台Logo
开发者文档
控制台

优化Unity WebGL的渲染性能

收藏
我的收藏
针对小游戏情况,可能存在较多中低端机型,因此对于渲染的优化非常必要,以下是几个可能会有帮助的建议
关于渲染的优化,可以参考官方

一. 渲染管线

1.1 Built-in 渲染管线

内置渲染管线功能较为全面,且各平台移植性强,但是相较于URP在图形质量和渲染特性上有所缺失,如对渲染没有太大的要求,内置渲染管线基本可以应对大多数情况,适用小游戏

1.2 URP 渲染管线

针对URP渲染管线的优化可以参考官方的视频
URP渲染管线是Unity官方提供的轻量级渲染管线,提供了良好的性能和平台移植性,同时支持自定义配置来选择启用或禁用某些渲染特性,适用小游戏
但是对于小游戏而言,URP的许多高级渲染特性还是过于冗余,小游戏的体量无法承载如Fog,Motion_Vector,和一些高级的后处理效果等高消耗的渲染特性。一种优化方向是定制精简版的,适用于小游戏的URP渲染管线。

1.2.1 定制URP渲染管线

针对小游戏情况,需要对渲染性能做尽可能的优化,而URP管线中许多复杂特性并不会在小游戏中应用,因此需要定制精简版的适合小游戏的URP管线。

1.3 HDRP 渲染管线

HDRP通常用于创建高质量的渲染效果,包括实时光线追踪,全局光照等,开销极大,不适用小游戏

1.4 SRP 自定义渲染管线

SRP是一种可编程的渲染管线,它允许开发者根据项目需求自定义和扩展渲染管线的各个阶段,为项目提供更高的自定义性和可扩展性。需要注意的是,SRP的开发和配置相对复杂,需要一定的渲染编程知识和经验。因此,在选择SRP时,开发者需要权衡项目需求、开发资源和时间限制,自行评估决定是否使用

二. 光照

光照是渲染中非常昂贵的一个环节,对于小游戏情况,应在大多数情况避免使用光照相关功能
如果游戏中无法避免使用光照,需要做较大的取舍和精简,尽量少使用实时光照,对于shading,尽量避免使用PBR-BRDF计算量较大的光照模型
为了尽可能保留渲染效果,通用的做法是,预计算相关的光照信息,如Light Map预计算光照信息存为一张纹理,在运行时采样纹理获取光照信息,或者基于预计算的实时全局光照Light Probe,通过预计算探针位置光照信息,在运行时对于需要光照信息的物体,插值计算距离最近的探针。预计算可以极大地减少运行时消耗,但是对于Light Map和Light Probe得到设置上仍然有很多可以优化的地方。
对光照的优化可以参考:

2.1 Light Map

Light map的限制是只能应用于静态的物体和静态的光源。
Light Map的优化可以参考官方的文档
关于光照贴图烘焙各个参数详细解释,及合适的配置,可以参考
几个通用的优化建议
    设置较低的光照贴图的分辨率。
    在Renderer组件的Lightmap Parameters选项中单独指定烘焙预设参数,建议使用较低配置。

2.2 Light Probe

    尽可能的少放置探针,只在对光照要求比较高且光线变化密集的地方放置探针。只在对实时全局光照有要求的区域考虑放置探针。
对于光照探针的优化可以参考

三. 阴影

和光照相似,阴影也是渲染中性能消耗较大的一环节,大多数游戏对于阴影的处理基本上都是另起一个额外的pass来渲染实时阴影。对于小游戏情况而言,要做到尽可能避免实时计算
对于静态的物体,使用阴影贴图,对于动态的物体,选用基于shadowMap的开销相对较小的方案。
对于阴影方向的优化可以参考
针对小游戏情况,几个通用的阴影优化方向:
    增加阴影距离裁剪的范围,可以在摄像机组件上进行设置。

四 .shader代码优化

对于shader代码上的优化策略可以参考
    减少使用if,else,或者循环等可能会导致分支的代码,if 语句 可以尝试使用 step 内置函数替代,原因是分支可能会打断GPU并行。
    尽可能使用低精度的浮点值,如 fixed/lowp 的计算速度是 float/highp 的四倍以上。
    优先使用Swizzle,而非独立操作单个通道,合理运用Mul_Add以减少不必要的移动指令。