首页 > 其他分享 >unity广州站gpu resident drawer笔记

unity广州站gpu resident drawer笔记

时间:2023-12-15 18:36:10浏览次数:33  
标签:render resident srp batch drawer unity gpu

unity广州站gpu resident drawer笔记

什么是gpu resident drawer

  将MeshRenderer数据转为BRG batch(BatchRendererGroup)数据的机制。

  它在unity6正式推出,并关联dots。
  它优化的是CPU耗时,但也可能进而提高gpu的性能。因为需要提交给GPU的绘制调用更少。
  通过gpu resident drawer绘制的dc可以在framedebuger中的Hybrid Batch Group看到。

gpu resident drawer的好处

  1.Persistent batch。更少的合批。
  2.BRG shader data model。 用SoA思想减少cpu与gpu传输数据的时间。(既优化了结构大小,也优化的顺序)
    官网说有1.5倍提升。
  3.gpu渲染n+1帧时,用户可能会尝试对persisent buffer进行写操作,会导致数据乱掉,gpu resident drawer通过双缓存解决这个问题。

gpu resident drawer如何组织batch

  传统srp组织batch的特点:

    srp batch组织根据mesh render顺序进行合批,render间会被不同数据(mesh || meterial)打断。
    srp组织render数据是每个render结构存储一个obj2world矩阵、world2obj矩阵和BaseColor。
    srp随场景复杂度提高,可能会有瓶颈。因为srp组织batch只在主线程中单线程执行(见Profiler的RenderLoop.GPUSrpBatcher)。且srp有减少cpu与gpu传输数据的时间,但不能减少drawcall。

  gpu resident drawer提交dc的大致流程

  MeshRenderer数据转为BRG batch数据。
  上传render数据到gpu
  renderer进行裁剪
  提交drawcall

  gpu resident drawer如何减少drawcall

    遍历一定范围Renderer的mesh和material一样,是否产生阴影,设置归属的BatchDrawRange组。
    重映射remap所有render的顺序。
    根据remap后的BatchDrawRange组提出三个数组(local to world、world to local和color,而srp是单个render一个local2worl、world2local 和colr)。

      前面提到了优化了结构大小便如下图,少了一个float。

    遍历所有相机,与每个相机的视锥6个平面求交,每个相机与每个可产生shadow的灯光进行一次计算。unity用多线程进行裁剪+ smid进行提速。封装成PlanePacked,用 brust对 每四个裁剪屏幕合并成一条指令的计算。
      每个 render分到8bit存储在裁剪屏幕求交的结果visibility mask。8 * 8bit= ulong.
      每个batch的下表都是从0开始。shader如何采用这些数据呢?会生成visable instanced, remap, 类似内存随机访问,类超低端机器上不好(可能会产生负优化)。

如何开启gpu resident drawer

urp

hdrp

此外,它还需要一些必要的设置(见gpu resident drawer兼容性)

gpu resident drawer的选择性关闭

  这在LateUpdate之后但在渲染开始之前每帧发生一次。
  如果在渲染期间移动对象,可能数据会乱掉。
  可以对象添加DisallowGPUDrivenRendering组件让这些对象不采用gpu resident drawer

gpu resident drawer兼容性

必要的设置

失效的案例

参考:
https://forum.unity.com/threads/gpu-driven-rendering-in-unity.1502702/
https://blog.unity.com/engine-platform/batchrenderergroup-sample-high-frame-rate-on-budget-devices

标签:render,resident,srp,batch,drawer,unity,gpu
From: https://www.cnblogs.com/lanyelinxiang/p/17903991.html

相关文章

  • Unity引擎2D游戏开发,实现人物下蹲逻辑和动画
    将下蹲动画创建进人物中在Animation窗口中的左侧,新建BlueCrouchStart动画时间轴,然后将下蹲动画拖入时间轴中62,63,64都是下蹲中的动画,但是64号是下蹲动作完毕后的静止动画,因为不拖入时间轴中,单独为其建立一个时间轴为64号下蹲动画完毕的静止动画单独创建一个时间轴,并命名为BlueC......
  • Unity3D ugui适配iPhoneX的齐刘海屏幕详解
    Unity3D是一款强大的游戏开发引擎,广泛应用于手机游戏开发。随着苹果推出了iPhoneX,这款全面屏手机的出现给游戏开发者带来了新的适配问题。本文将详解如何在Unity3D中适配iPhoneX的齐刘海屏幕,并给出相应的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习......
  • Unity shader 里面使用数组
    很多人不知道Unityshader是支持通过C#脚本,往shader脚本里写入数组的。我不知道Properties里面怎么写,但是可以用C#代码往里写。数组的总长度似乎最大2048。注意,是所有数组的总长度加一起不能超过2048。比如你写了五个数组,每个数组的长度是100,五个数组的总长度就是500。不是......
  • Unity引擎2D游戏开发,实现跳跃动画
    由于跳跃动画分为了很多个部分,所以需要对每个部分进行重新命名。接着,再将此动画分为两大类,一类空中动作(Jumpanimation),一类落地动作(Landinganimation)选择Player人物,在下方Animation中,新建动画动画新建和命名规则,根据guide内的颜色分类来进行新建动画混合树由于动画太多,......
  • Unity引擎2D游戏开发,实现按键行走
    既然是实现按下按键进行一个动作,比如行走动作。那么就需要在InputControl内加入按键,并通过C#代码调用这个按键绑定一个事件来实现此功能在InputControl内加入新的按键打开PlayerInputControl创建一个新的按键组,并绑定Shift(通过Shift键控制行走动作)通过C#代码调用按键,并实......
  • Unity3D协议怎样通过应用层来实现可靠性
    Unity3D是一款流行的游戏开发引擎,它提供了丰富的网络功能来支持多人游戏。其中,UDP(UserDatagramProtocol)是一种无连接的传输协议,它提供了高效的数据传输,但不保证数据的可靠性。本文将介绍如何通过应用层来实现UDP协议的可靠性,并给出技术详解和代码实现。对啦!这里有个游戏开发交......
  • Unity3D 如何读取策划给定的Excel表格详解
    前言Unity3D是一款非常流行的游戏开发引擎,它可以帮助开发者快速构建游戏并进行测试和发布。在游戏开发过程中,策划经常会提供一些Excel表格,这些表格包含了游戏中的各种数据,如角色属性、技能效果等等。那么,如何在Unity3D中读取这些Excel表格呢?本文将详细介绍Unity3D如何读取策划给......
  • Unity3D 开发中有那些提升效率的高级技巧详解
    Unity3D是一款强大的游戏开发引擎,它提供了许多功能和工具来帮助开发者提高效率。本文将详细介绍Unity3D开发中的一些高级技巧,包括资源管理、内存优化、代码优化以及性能调优等方面。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发......
  • Unity3D UDP协议怎样通过应用层来实现可靠性
    Unity3D是一款流行的游戏开发引擎,它提供了丰富的网络功能来支持多人游戏。其中,UDP(UserDatagramProtocol)是一种无连接的传输协议,它提供了高效的数据传输,但不保证数据的可靠性。本文将介绍如何通过应用层来实现UDP协议的可靠性,并给出技术详解和代码实现。对啦!这里有个游戏开发交......
  • Unity引擎2D游戏开发,创建人物动画
    给人物创建Animator动画组件在素材库新建Animation文件夹专门存动画相关的文件Animation文件夹中创建Player文件夹右击Player文件夹,创建AnimatorController将新建的AnimatorController赋予人物中Animator组件中的Controller选择Window,选择Animation,打开Animator窗......