深入URP之Shader篇14: GPU Instancing

GPU Instancing

必须是同一个模型,材质也必须相同,但材质的参数可以不同(使用MaterialPropertyBlock指定),然后基于一个Instanced Draw Call,一次性绘制多个模型。
参考:https://docs.unity3d.com/Manual/GPUInstancing.html

SRP中几种Bathcing方式的优先级

  • 如果物体是静态的(Batching Static),则会使用Static Batching。如果物体的材质兼容SRP Batcher,则会同时使用SRP Batcher。
  • 如果物体的材质和Renderer兼容GPU Instancing,则会启用GPU Instancing
  • 如果开启了Dynamic Batching,则会使用动态Batch。
    由上可知,如果想启用GPU Instancing,必须不能开启Static Batching,且不能满足SRP Batcher条件。
    如果材质是兼容GPU Instancing的,且物体是开启了Static Batching的,则Unity会在物体的Inspector中给出提示:
    在这里插入图片描述

GPU Instacing开启的条件

  • 首先Shader必须兼容与Instancing。
  • 材质开启 Enable GPU Instancing
  • SRP Batcher的优先级高于GPU Instancing,对于Game Objects,如果SRP Batcher能被使用(Shader兼容SRP Batcher,节点本身也兼容等),则就会使用SRP Batcher,即便材质开启了Enable GPU Instancing也没用。
  • 如果SPR Batcher的条件被破坏,例如使用了MaterialPropertyBlock,且开启了Enable GPU Instancing,则GPU Instancing则会启用。

GPU Instancing的性能

  • GPU Instancing对于顶点数比较少的模型不一定能提高性能,因为顶点数少时GPU不能充分的分配资源去绘制多个实例,这个顶点数的阈值根据不同显卡是不一样的,但一般来说少于256个顶点是不合适的。
  • 如果有很多顶点少的物体需要绘制,可以将他们合并到一个mesh中进行绘制。

自定义Shader兼容GPU Instancing

UNITY_INSTANCING_BUFFER_START(UnityPerMaterial)UNITY_DEFINE_INSTANCED_PROP(float4, _BaseColor)
UNITY_INSTANCING_BUFFER_END(UnityPerMaterial)struct Attributes
{float3 positionOS : POSITION;UNITY_VERTEX_INPUT_INSTANCE_ID
};struct Varyings
{float4 positionCS : SV_POSITION;UNITY_VERTEX_INPUT_INSTANCE_ID
};Varyings UnlitPassVertex(Attributes input)
{Varyings output;UNITY_SETUP_INSTANCE_ID(input);UNITY_TRANSFER_INSTANCE_ID(input, output);float3 positionWS = TransformObjectToWorld(input.positionOS);output.positionCS = TransformWorldToHClip(positionWS);return output;
}float4 UnlitPassFragment(Varyings input) : SV_TARGET
{UNITY_SETUP_INSTANCE_ID(input);return UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _BaseColor);
}
  • 首先,定义PerMaterial Uniform block时,要使用INSTANCING相关的宏UNITY_INSTANCING_BUFFER_STARTUNITY_INSTANCING_BUFFER_ENDUNITY_DEFINE_INSTANCED_PROP。这些宏的作用是将Uniform block定义成数组。需要注意的是,只有当同一个材质下面的不同Instance存在逐Instance不同的属性时,才需要将UnityPerMaterial的CBuffer改成使用这些宏,否则是不需要的,因为这些宏只是为了将属性定义成数组,然后可以使用Instance索引去得到数组里面不同Instance各自的属性。另外,由于CBuffer的名字不能冲突,所以也不能仅仅将不同的属性单独拿出来使用这些宏包裹,如果需要拿出来就得全部拿出来,也就是将SRPBatcher使用的CBuffer的宏替换成这些宏。
  • VS和FS的输入都要使用结构体作为参数,且结构体中需要使用宏UNITY_VERTEX_INPUT_INSTANCE_ID定义逐物体的instance id。
  • 在VS和FS中,都要使用宏UNITY_SETUP_INSTANCE_ID来设置instance id变量,这个宏的作用是使用一个base instance id和input中的instance id组合出一个instance id变量来作为数组索引获取相应的属性值。
  • 如果需要在FS中获取属性,则VS中需要使用宏UNITY_TRANSFER_INSTANCE_ID从input向output传递instance id。然后在FS中使用宏UNITY_ACCESS_INSTANCED_PROP获取属性。当然如果是在VS中获取所有属性进行计算,则不需要传递,直接在VS中使用宏UNITY_ACCESS_INSTANCED_PROP获取属性。
  • 另外,必须要添加#pragma multi_compile_instancing

让Shader不兼容SRP Batcher

使用上面这些宏,其实也就同时兼容了SRP Batcher。如果在Renderer上使用MaterialPropertyBlock,则会破坏SPR Batcher的兼容性,从而可以使用GPU Instancing。但如果不使用MaterialPropertyBlock呢?也可以通过修改Shader来让Shader不兼容于SRP Batcher,方法是在材质的Properties中定义一个属性,但是这个属性不要放到UnityPerMaterial的block中。具体文档是这么说的:

Removing shader compatibility
You can make both hand-written and Shader Graph shaders incompatible with the SRP Batcher. However, for Shader Graph shaders, if you change and recompile the Shader Graph often, it’s simpler to make the renderer incompatible instead.
To make a Unity shader incompatible with the SRP Batcher, you need to make changes to the shader source file:
For hand-written shaders, open the shader source file. For Shader Graph shaders, copy the Shader Graph’s compiled shader source code into a new shader source file. Use the new shader source file in your application instead of the Shader Graph.
Add a new material property declaration into the shader’s Properties block. Don’t declare the new material property in the UnityPerMaterial constant buffer.
The material property doesn’t need to do anything; just having a material property that doesn’t exist in the UnityPerMaterial constant buffer makes the shader incompatible with the SRP Batcher.
Warning: If you use a Shader Graph, be aware that every time you edit and recompile the Shader Graph, you must repeat this process.

但我实际测试发现,这个新定义的属性必须在Shader中用到,否则就不会去除SRP Batcher的兼容,我猜测是Shader代码编译时优化掉了不使用的属性。

参考

  • Unity文档:GPUInstancing
  • catlikecoding.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1619142.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

9.3 功率放大电路的安全运行

在功率放大电路中,功放管既要流过大电流,又要承受高电压。例如,在 OCL 电路中,只有功放管满足式(9.2.13)所示极限值的要求,电路才能正常工作。因此,所谓功率放大电路的安全运行&…

八年终有一别

告别文章,本文应该所有的名字都会真名,我不知道侵犯权益什么的,希望不要冒犯到。 NOIp2018 提高组游记 ZJOI2019上海游族杯acm游记 绍兴一中集训记 NOI2019同步赛 day1 NOI2019同步赛 day2 绍兴一中暑假集训总结 慈溪中学集训记 CSP-S2019游…

怎么用Linux下载链接,在linux系统里,下载的迅雷专用链接!

wtf1981 于 2009-06-03 21:18:08发表: 事实看看 you_me 于 2009-05-20 19:34:17发表: 试试看吧 563909373 于 2009-05-20 19:11:23发表: 学习一下! kuiying 于 2009-05-17 21:39:25发表: 好阿 支持一下!!!!&#xff01…

如何减小迅雷下载对网络的影响

导言 很多用户都喜欢用迅雷进行各种资源的下载,因为迅雷通过镜像搜索可以同时从多个高速站点进行下载,从而达到满速下载的目的。但是,对于企业主/网管人员来说,高速下载的迅雷会占用有限的网络资源,在自己享受高速度的…

大规模 C++ 编译性能优化系统 OMAX 介绍

导读:本文探索&研究了大规模C/C服务编译性能优化相关技术,优化服务性能,降低机器成本,同时为了支持规模推广应用,降低业务线接入成本,保障优化效果,进行面向云上微服务,开展平台…

如何使用缓存优化系统性能?

缓存是我们提高系统性能的一项必不可少的技术,无论是前端、还是后端,都应用到了缓存 技术。前端使用缓存,可以降低多次请求服务的压力;后端使用缓存,可以降低数据库操作 的压力,提升读取数据的性能。 今…

关键词优化系统|智能优化「白狐公羊seo」

1.SEO的设置 。要进行SEO网站优化的前提,先设置TDK,三个重要的参数:title、keywords、description。因为TDK是一个网站优化的核心要素和重要标志。后期的优化都是围绕着TDK来进行的。设置TDK是对 网站优化排名 提升的其中一个方法。 2. 内容标题优化…

windows10 优化系统性能

以下仅供参考: 1、设置中 2、 设置中》搜索【启动应用】,关闭启动机器自动启动的应用 或者在任务管理器中 3、回收站 右键【属性】》一般设置为10G到15G之间 4、电源计划中设置高性能 考虑到个人健康 power shell命令中: 然后【更改计划】…

大规模C++编译性能优化系统OMAX介绍

导读:本文探索&研究了大规模C/C服务编译性能优化相关技术,优化服务性能,降低机器成本,同时为了支持规模推广应用,降低业务线接入成本,保障优化效果,进行面向云上微服务,开展平台…

系统优化方案

亲爱的用户,当您觉得计算机速度过慢,或者您想清理系统垃圾的话,您只需按照以下步骤操作即可哦(^U^)ノ~YO 一、手动清除系统盘的缓存文件: 打开桌面【此电脑】图标&#x…

如何进行系统性能优化

前言 不战而屈人之兵,善之善者也 性能优化的第一原则是,通过测试,日志,profiling 分析出哪有问题,然后有的放失。 性能优化时持久战,在深入理解业务后,结合系统响应,系统吞吐&#…

win10计算机系统优化设置,win10系统优化系统的详细办法

作为大多数用户都使用的win10系统,如果发生对win10系统优化系统进行设置情况,会让人束手无策,那么win10系统优化系统是怎么设置的呢?如果有朋友想对win10系统优化系统进行设置的话,按照1、右键点击“此电脑”&#xff…

系统优化的方法有哪些

对于很多人来说,系统优化可能只是个概念,真正想要操作的时候却又无从下手,然后一个不小心把系统搞崩溃了又凉凉。下面就和大家简单聊聊系统优化应该从哪几个方面去操作吧。 更多系统教程尽在小白系统重装官网 系统:win10专业版 …

八 在IDEA中设置省电模式

如下图所示,IntelliJ IDEA 有一种叫做 省电模式 的状态,开启这种模式之后IntelliJ IDEA 会关掉代码检查和代码提示等功能。所以一般也可认为这是一种 阅读模式,如果你在开发过程中遇到突然代码文件不能进行检查和提示,可以来看看这…

嵌入式linux更省电,- 基于嵌入式Linux的智能手机省电设计

用户程序API, 用户程序( 应用软件) 分为三类: (1)可感知电源管理的应用软件; (2)可感知电源管理的“包装器”中的传统应用软件; (3)不带电源管理的传统应用软件。 可感知电源管理的应用软件能够充分利用来自策略管理器的API, 从而建立各自的基…

一级节能和三级节能有什么区别

等级不同:一级节能产品能源效率达国际先进水平,三级的为市场平均水平。能耗量不同:一级和三级节能产品全年耗电量分别为634度781度。省电程度不同:同规格产品在同样条件下,一级节能产品比三级的节能15%左右。 以变频空…

计算机系统节能减排,节能减排,我们怎么做?

原标题:节能减排,我们怎么做? 节能减排 节俭但不算计,环保但不做作 节能环保已被越来越多的人接受 形成了一种特定的文化 保护环境并没有想象中的那么难 只要我们从小事做起 就会让地球母亲焕然一新 空用完拔插头,省电…

android屏幕省电,AMOLED屏幕省电吗 AMOLED屏幕耗电测评测

毫无疑问屏幕是最能够直接影响用户体验的部件之一,而关于AMOLED屏幕好还是LCD屏幕好的争论也从未停止。与LCD屏幕相比,AMOLED屏幕的最大优点之一便是在显示黑色或深色颜色时更加节能,但事实的确如此吗?而从Greenhot给出的结果来看…

计算机省电模式在什么地方,计算机打开并显示省电模式应该怎么办

打开计算机电源后,始终会显示省电模式,然后屏幕始终是黑色,并且无法访问系统。如果在打开计算机电源时显示省电模式,该怎么办?今天,我将讨论打开计算机电源时的省电模式解决方案。方法。 计算机打开时显示的省电模式解决方案1 ​​ 1)显示器电源关闭,或显示器数据电缆接…

Linux内核省电社区,【整理】Linux禁用CPU省电状态/Linux系统性能调优 | 勤奋的小青蛙...

为了提升CPU性能,我们要禁用CPU省电状态。 我们强烈推荐禁用CPU的省电模式, 进行此更改可能会导致功耗增加,但会提高稳定性和性能。 那么:如何在Redhat或Suse Linux系统上禁用CPU节能状态? 对于RedHat Linux(版本7及更…