DrawCall,Batches,SetPass calls是什么?原理?【匠】

目录

先来看看 CPU 到 GPU 通信原理图:

DrawCall是什么?

Batches( 批处理 )是什么?

SetPassCall是什么?

下面是默认渲染管线和URP上的SetPass calls值 实验。

默认渲染管线

URP

额外内容

参考:


这三个值大家应该比较眼熟,也就是Unity点击Stats弹出的窗口里的信息。

官网渲染 Statistics 窗口信息:https://docs.unity.cn/cn/current/Manual/RenderingStatistics.html

先来看看 CPU 到 GPU 通信原理图:

渲染流程如下:(内置渲染管线 / 在URP未开启SRP Batcher)

 

DrawCall是什么?

DrawCall就是一个渲染命令,理解成它来告诉GPU渲染哪个物体即可。这个命令指向一个需要被渲染的图元(点,线,面等)列表,不包含任何材质信息,这个命令本身并没有多少开销。

Batches( 批处理 )是什么?

其实就理解成DrawCall值就可以,一个Batch至少包含一个DrawCall,那么为什么不叫DrawCall呢?

  • 原因 1:Unity引擎开启批处理情况下将把满足条件的多个对象的渲染组合到一个内存块中以便减少由于资源切换而导致的 CPU 开销,也就是把多个DrawCall合并成一个DrawCall,来减少调用DrawCall的开销(主要是调用DrawCall之前的一系列设置),这个操作就是批处理。
  • 原因 2:把数据加载到显存,设置渲染状态及数据,CPU调用DrawCall的这一整个过程就是一个Batch。这个过程当中主要性能消耗点在于上传物体数据(加载到显存)设置渲染状态及数据这一块,而不是DrawCall命令本身。

下图中的一整个流程为一个Batch

在下图中Batches值为3

 

SetPass calls是什么?

官网解释:渲染 pass 的数量。每个 pass 都需要 Unity 运行时绑定一个新的着色器。

个人解释:

内置渲染管线:是所有材质球的渲染pass的数量。这里可能会有疑惑,拿Unity内置的 Lit Shader来举例,这Shader里有好多个Pass通道,SetPass calls值却跟Pass通道数量始终对不上,个人猜测这是因为Unity渲染时会选择Pass通道渲染,比如关闭阴影,那么Unity就不会选择阴影渲染通道也就是 ShadowCaster通道。

URP:渲染不同pass的数量跟内置渲染管线不一样的是在URP不局限于材质球,也就是假如有五个材质球,但Shader和关键字都一样,这个Shader有两个Pass通道,那么这些物体的SetPass Calls值就是2。

其实想想也是合理的,SetPass calls值个人猜测官网主要是想呈现跟批处理相关的值,在内置渲染管线只能批处理使用同样材质球的物体,所以这个值为所有材质球的渲染Pass通道数量,在URP开启SRP Batcher情况下呢,是根据相同Shader变体的pass进行合批。

 

下面是默认渲染管线URP上的SetPass calls值 实验。

假如 场景当中(关闭其他因素的情况下,如阴影,天空盒等,为了更方便计算)摄像机照射范围内有9个物体,用的都是一个Shader的情况下,4个物体分别用不同材质球,剩下5个物体使用同一个材质球时,那么一共有5个材质球。

默认渲染管线:

不同颜色代表着不同的材质球

结论:SetPass calls值等同于材质球的pass数量(关掉了阴影,所以没有走阴影Pass通道)

URP

未开启SRP Batcher情况下(不同颜色代表着不同的材质球)

开启SRP Batcher情况下(不同颜色代表着不同的材质球)

结论:未开启SRP Batcher情况下跟内置管线一样,开启SRP Batcher情况下等同于渲染状态(pass)切换次数。

 

额外内容

CPU和GPU通信原理参考来自UnityShader入门精要(书籍) 和 RenderDoc抓帧数据。

以下是用RenderDoc抓的每个物体DrawCall图

物体 1(绿色物体,Shader:Standard)

物体 2(黄色物体,Shader:Standard)

物体 3(浅红色物体,Shader:Unity/Color)

重点关注glUniform4fv和glUseProgram即可。

 

参考:

  1. UnityShader入门精要(书籍)
  2. Batch, Draw Call, Setpass Call:https://zhuanlan.zhihu.com/p/76562300

 

 

<think>好的,用户想了解流式访问的基本概念及其原理,尤其是在IT领域中的应用。首先,我需要明确“流式访问”的具体定义,可能涉及数据流的处理方式。根据用户提供的引用内容,有三个来源:[^1]提到流式套接字和服务器构建,[^2]讨论Spark Streaming处理流数据,[^3]涉及Java的Stream API。 首先,流式访问可能指数据传输的实时性,比如流媒体或实时数据处理。引用中的流式套接字使用TCP,确保可靠传输,这可能与实时通信相关。引用中的Spark Streaming处理流数据,强调可伸缩和容错,与大数据处理有关。引用的Java Stream API则是关于数据处理的函数式编程,可能涉及内存中的数据流操作。 接下来需要将这些概念整合,区分不同场景下的流式访问:网络通信中的流式传输、大数据中的流处理、编程中的流式API。每个方面需要解释原理,比如TCP的可靠传输、微批处理技术、延迟执行机制等。 还要注意用户可能混淆这些不同领域的流式概念,需要明确区分并举例说明。同时,生成相关问题时要覆盖各个应用场景,帮助用户深入理解。确保回答结构清晰,引用正确,比如Spark Streaming使用RDD抽象,Java Stream是延迟执行的,这些都要正确标注来源。 最后检查是否符合系统级指令:行内公式正确,独立公式单独成段,中文回答,问题相关且覆盖不同方面。确保引用标识正确添加,例如Spark Streaming部分引用,Java Stream引用,网络套接字引用。</think>### 流式访问的概念及原理 在IT领域中,**流式访问**(Streaming Access)指以连续、实时或按需的方式处理数据流的技术。其核心原理是通过**分块传输**或**增量处理**,避免一次性加载全部数据,从而提高效率并支持动态响应。以下是不同场景下的具体实现: --- #### 1. **网络通信中的流式传输** 通过流式套接字(如TCP)实现可靠的数据传输。 - **原理**: - 数据被分割为小数据包(如TCP报文段),按顺序发送并确保完整性。 - 接收端实时处理数据包,无需等待全部数据到达。 - 示例:视频直播、实时聊天。 - **技术特点**: - 使用$RTT$(Round-Trip Time)优化传输延迟。 - 通过滑动窗口协议控制流量,防止拥塞。 --- #### 2. **大数据流处理** 如Spark Streaming将连续数据流划分为微批次(Micro-Batches)进行处理。 - **原理**: - 数据流按时间窗口(如1秒)切分为离散的RDD(弹性分布式数据集)。 - 对每个RDD执行类似批处理的转换操作(如`map`、`reduce`)。 - 公式化表示为: $$ \text{Stream} = \bigcup_{t=0}^{T} \text{RDD}_t $$ - **优势**: - 支持容错(通过RDD血缘关系恢复数据)。 - 与Kafka、Flume等数据源无缝集成。 --- #### 3. **编程中的流式API** 如Java 8的`Stream`接口支持函数式流水线操作[^3]。 - **原理**: - 数据集合(如列表)转换为流,通过`filter`、`map`等方法链式处理。 - 采用**延迟执行**(Lazy Evaluation),仅在终止操作(如`collect`)时触发计算。 - 示例代码: ```java List<Integer> result = numbers.stream() .filter(n -> n % 2 == 0) .map(n -> n * 2) .collect(Collectors.toList()); ``` - **特点**: - 减少中间变量,提升代码可读性。 - 并行流(`parallelStream()`)可自动利用多核CPU。 --- ### 核心区别与共性 | **场景** | **数据特征** | **关键技术** | **目标** | |----------------|----------------------|----------------------------|-----------------------| | 网络通信 | 连续、实时 | TCP流式套接字、滑动窗口 | 可靠传输低延迟 | | 大数据处理 | 高吞吐、持续生成 | 微批次、RDD抽象 | 实时分析容错 | | 编程API | 内存中有限数据集 | 延迟执行、函数式操作 | 高效集合处理 | ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙笑~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值