【Unity】DrawCall 研究随记

news/2024/11/29 18:33:09/文章来源:https://www.cnblogs.com/pkmoon/p/18054244

参考文档:1. BatchBatchBatch.PDF

参考文档:2. DrawCall,Batches,SetPass calls是什么?原理?【匠】

DrawCall (绘制调用) 是什么

DrawCall就是CPU调用图像编程接口,比如 DirectX 的 DrawPrimitive/DrawIndexedPrimitive ,OpenGL 的 glDrawElement/glDrawArrays,以命令 GPU 进行渲染的操作

简单来讲,就是指 CPU 向 GPU 发送一条指令,用于进行渲染操作。即:DrawCall 就是一次渲染指令调用

Batches (批处理)又是什么

把数据加载到显存,设置渲染状态及数据,CPU 调用 DrawCall 的这一整个过程就是一个 Batch。

这个过程当中主要性能消耗点在于上传物体数据(加载到显存)和设置渲染状态及数据这一块,而不是DrawCall命令本身。

所以我们将多个 DrawCall 合并为一个 DrawCall 来减少调用DrawCall的开销(主要是调用DrawCall之前的一系列设置)

这个操作就是 Batches 批处理。

什么会造成DrawCall增加

1.无法合批/打断合批

1.Batch Breaker: Texture Change

纹理的更改会造成合批被打断,即:会增加 Batches 的数量,而 Sprite 的更改不会。

解决方法:若要降低 DrawCall ,可使用打包图集的方法。

RawImage 的图片更换则一定会打断合批。

2.Batch Breaker: Transform Change

位置、旋转、缩放、等空间变化的更改会打断合批。

解决方法:在 UGUI 的使用中进行动静分离,以减少 UI 重绘,降低 DrawCall

3.Batch Breaker: Material Change

不同材质的物体也没办法进行合批,会造成合批被打断

解决方法:1.使用材质图集将多个纹理合并为一个纹理,以便多个对象可以使用同一个材质,从而实现合批。

2.使用 Material Property Blocks 进行材质的动态属性修改

示例:
// 获取材质实例
Material instanceMaterial = renderer.material;// 使用 Material Property Blocks
MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
propertyBlock.SetColor("_Color", Color.red); // 修改颜色
renderer.SetPropertyBlock(propertyBlock);

2.透明物体

对于透明物体而言,透明物体必须按照特定的顺序进行渲染,通常是从后到前。这是因为透明物体的混合效果依赖于其后面的物体的渲染结果。因此,透明物体的渲染顺序要求额外的处理

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构查找

语雀链接:https://www.yuque.com/g/wushi-ls7km/ga9rkw/kl8h357ofcgocddz/collaborator/join?token=AwLuhwfJL8wLO2FH&source=doc_collaborator# 《数据结构查找》

ARM Trusted Firmware-A RISC-V OpenSBI 汇总

Trusted Firmware-A如图为 ARM TrustedFirmware (可信固件) 开源项目集合,它为带有 Exception Level 3 (EL3) Secure Monitor 的 ARM 架构 (Armv8-A、Armv9-A 和 Armv8-M 等) 提供了安全软件的实施参考实现。 1. TF-A 概述 Trusted Firmware-A (TF-A) project 是 ARM 可信固件…

使用 Keil 新建 Arm Visual Hardware(AVH) 项目

1 新建并配置项目 1.1 新建项目 我这里想模拟 Cortex-M55 核心,因此选择 SSE-300-MPS3由于是简单教程,我只想输出一个最简单的 Hello World,因此仅勾选串口相关的组件这里还需要特殊勾选一下以下选项1.2 配置Target Software Model 处选择 TrustZone disabledRead/Write Mem…

Java面试之多线程并发篇(9)

前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!引用类型有哪些?有什么区别?说说你对JMM内存模型的理解?为什么需要JMM?多线程有什么用?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘 *** 12万字的java面试题整理 *** *** java核心面试知识整…

记录---前端如何优雅通知用户刷新页面?

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣前言 老板:新的需求不是上线了嘛,怎么用户看到的还是老的页面呀 窝囊废:让用户刷新一下页面,或者清一下缓存 老板:那我得告诉用户,刷新一下页面,或者清一下缓存,才能看到新的页面呀,感觉用户体验不好啊,不能直接…

一文多发小工具

一个一文多发的发布小工具 一个一文多发的发布小工具,作为练手的项目。 概述: 如果有将文章分享到多个平台的需求,可以借助程序来简化这一过程,节省时间并提高效率。 实现思路: 大多数平台支持markdown格式的文本内容,将.md文件作为入口文件读取,发布到各个平台;由于ma…

为 TVM 添加对 Paddle 量化模型的支持

1 简介 随着深度学习应用的广泛使用,量化模型作为一种有效的模型压缩技术,能够在保持模型精度的同时减少模型的计算和存储开销。本文将介绍如何在 TVM 上为 Paddle 深度学习框架中的量化模型提供解析支持。 2 量化方法 目前主流的的量化方法主要分为 QOperator 和 QDQ(Quanti…

tp6 url 规则

http://tp.cc/index.php/index/test return view( index, [info => $info, sj=>$sj] );

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

我们用了接近一年的时间完成了基于 OTel Java Agent 的升级重构,并于今年 5 月份发布了 4.x 探针的第一个版本 4.1.0,经过接近半年时间的验证、回归、优化,目前最新的稳定版本 4.1.12[11]已经正式发布,欢迎大家了解使用。作者:陈承 背景 在 2018 年的 2 月,ARMS Java Age…

BIM技术:数字孪生城区建设的加速器

在智慧城市建设的浪潮中,BIM(建筑信息模型)技术以其独特的优势,成为推动数字孪生城区建设的重要技术力量。本文将探讨BIM技术如何成为数字孪生城区建设的加速器,以及其在建设过程中的关键作用。BIM技术与数字孪生城区的融合数字孪生城区是指在数字空间构建一个与实体城市相…

ADF - [01] 概述

题记部分 001 || 简介Azure Data Factory (ADF) 是微软 Azure 云平台提供的一种数据集成服务,它允许用户创建、安排和管理数据管道,以实现从不同来源抽取数据、转换数据并加载到目标存储的过程。这个过程通常被称为 ETL(Extract, Transform, Load)。002 || 适用场景 【1】…

使用Powershell运行脚本报错的处理方法

最近在一台办公电脑上运行powershell脚本时报错如下: 系统上禁止运行脚本。有关详细信息,请参阅 https :/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 + .\CreateFolders.ps1 + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : S…