Version: 1.8
语言 : 中文
DOTS Instancing shaders
GameObject兼容GPU Resident Drawer

GPU Resident Drawer

GPU Resident Drawer 会自动的使用BatchRendererGroupAPI进行GPU实例化渲染,来减少渲染中draw calls的数量和CPU的处理时间。更进一步的信息,可以参考How BatchRendererGroup works。在小游戏平台下的变化,参考小游戏 GPU Resident Drawer

当前GPU Resident Drawer适用的条件有以下几个方面:

  • 使用URP渲染管线的3D项目(不支持2D项目)
  • 使用 Forward+ 渲染路径,或在 单个平行光源 的场景里使用Forward渲染路径
  • 具有Mesh Renderer的GameObject(不支持 SkinnedMeshRenderer )
  • 不支持Speed Tree组件

否则,引擎将不使用GPU实例化来绘制游戏对象。

如果开启了GPU Resident Drawer的功能,那么会有以下限制:

  • 构建时间会变长,因为需要编译所有BatchRendererGroup的着色器变体,同时编译产物也会更大。
  • Render Queue大于2500(透明物体)的Pass暂时不支持。如果有需要,可以在Package中修改限制条件。
  • 目前暂时不支持MotionVectors,例如TAA等利用到MotionVectors的功能暂时无法支持。

如何开启GPU Resident Drawer

请按照以下步骤操作:

一. 在Edit > Project Settings > Quality, 双击Render Pipeline Asset的属性值,在Inspector中配置URP资产管线。

二. 在Rendering部分,将GPU Resident Darwer的值设为Instanced Drawing

三. 在Project Settings > GraphicsShader Stripping部分,将BatchRendererGroup Variants值设为Keep All

四. 在Rendering部分,启用SRP Batcher。如果看不到该属性,打开菜单Edit > Preferences, 在Core Render Pipeline中将Visibility设置为All Visible

五. 在Rendering部分,双击Renderer List中的renderer,将Rendering Path值设为Forward+Forward

六. 参数调节

GRD Data Storage表示GPU Resident Drawer的数据存储方式,TextureSSBOTexture对平台的兼容性最好,对所有平台都支持;而SSBO在支持的平台上的数据频繁更新的开销更小,但不支持OpenGLOpenGL ESWebGL

BRG Shader Variant Strip表示对应变体的剔除逻辑,可以减小打包后的包体大小。Keep SSBO or Uniform为保留使用SSBO或者Uniform的BRG的变体,剔除掉使用Texture的Shader变体;Keep Texture为保留使用Texture的BRG变体,剔除掉使用SSBO或者Uniform的变体;而Keep All则同时保留两类变体;注意这里的选项需与上面的GRD Data Storage选项对应

如果每帧更改或创建物体,GPU Resident Drawer也会跟随这些变化进行更新操作。 要包含或排除使用 GPU Resident Drawer 的游戏对象,参考:GameObject兼容GPU Resident Drawer

分析GPU Resident Drawer

为了分析GPU Resident Drawer的结果,可以参考如下方式:

  • Frame Debugger. GPU Rensident Drawer会依据绘制命令,将物体分组为Hybrid Batch Group
  • Rendering Statistics. Rendering Statics 可以检查帧率是否增加,CPU处理时间和SetPass数量是否减少。

优化GPU Resident Drawer

GPU Resident Drawer能为渲染加速多少取决于场景的情况。在以下条件下,GPU Resident Drawer能更有效率:

  • 场景比较大。
  • 多个GameObjects使用相同的mesh,这样可以把他们分组到一个draw call中绘制。

在场景界面或者游戏界面,渲染通常提升的不如在播放时或者最终生成的项目那么多。

下面的设置或许能帮助进一步加速GPU Resident Drawer:

  • 打开Project Settings > Player页面,在Other Settings一栏中禁用Static Batching
  • 打开Window > Rendering > Lighting页面,在Lightmapping Settings一栏中启用Fixed Lightmap Size和禁用Use Mipmap Limits

Known Issues

GPU Resident Drawer部分限制:

  • 如果在RenderFeature里有增加Material Override Mode的材质,且材质本身不支持GPU Resident Drawer(使用自定义shader且实现不满足要求,例如未声明dots_instancing keyword等),这种情况下Override的材质可能无法正确的显示。
  • 在Editor打包成功后可能会出现场景不渲染,并在控制台输出错误日志的情况,这个时候reload场景或者reload project即可以恢复正常,Player模式不受影响。
  • 引擎会根据GPU Resident Drawer开关对Shader变体进行裁剪,以减少其数量。因此,在Player中动态开关GPU Resident Drawer时,可能会因找不到变体而导致渲染错误。可以修改Package源码,手动移除Shader变体裁剪的逻辑代码。
  • Forward路径下灯光目前只支持单一主方向光。
  • SpeedTree的物体暂时不支持Wind的效果,开启Wind后物体会回退到GRD Disable的渲染状态
  • 在Android手机上使用Vulkan,打development包调试时,会报Platform does not support uploading texture2d subrect data这个错误,但release包不受影响。
  • 如果meshRenderer设置使用了LightProbe,但是又设置了Contribute Global Illumination,这种情况下的LightProbe表现可能不对。
DOTS Instancing shaders
GameObject兼容GPU Resident Drawer