Unity Batching 批处理

news2025/1/13 10:34:25

Unity Batching 批处理

了解批处理前先了解下 Draw Call
要了解 Draw Call 需要先了解游戏引擎是如何把物体图像绘制到屏幕上的。

(1):渲染流水线
渲染流水线的任务为从一个 二维、三维场景开始,最终渲染为一张二维图像,显示在屏幕上。
计算机需要处理一系列的顶点、纹理、光照 等信息,把这些信息转化为肉眼可视的图像。这个工作通常是由 CPUGPU 共同完成的。
Runder-Time Rendering 一书中将一个渲染流程分为 3 个阶段:应用阶段(Application Stage)、几何阶段(Geometry Stage)、光栅化阶段(Rasterizer Stage).
每个阶段本身也是一个流水线系统,包含了各种子流水线系统。

应用阶段 -> 几何阶段 -> 光栅化阶段

(2) 应用阶段
应用阶段由 CPU 负责实现,大概分为 3 个阶段
(2.1)把数据加载到显存中(把数据从硬盘加载到内存,然后网格、纹理等数据加载到显卡存储空间显存)
(2.2)设置渲染状态(状态定义了使用什么网格、纹理贴图、光照数据、材质等)
(2.3) 调用 DrawCall
设置过渲染状态,CPU 需要调用一个渲染命令,告诉GPU开始渲染,这个命令就是 Draw Call

Draw Call 就是 CPU 调用图像编程接口,如 OpenGL中的 glDrawElements 命令,或者 DirectX 中的 DrawIndexedPrimitive 命令,然后 GPU 进行渲染操作

GPU 拿到一个 Draw Call 时,GPU 会根据渲染状态(材质、纹理、着色器等)和所有输入的顶点数据进行计算,最终输出成屏幕上显示的图像,这个过程是GPU流水线。

(3) CPU 和 GPU 是如何实现并行工作的
答案是命令缓冲区(Command Buffer),命令缓冲区包含一个命令队列,由CPU向其中添加命令,GPU 从中读取命令,添加和读取是相互独立的,命令缓冲区的命令有多种,Draw Call 是其中一种。

(4)Draw Call 多了会影响性能
(4.1)创建 10000 个文件,每个文件大小 1KB总大小为 10MB,从一个文件夹复制到另一个文件夹
(4.2)创建 一个文件,大小为 10 MB,从一个文件夹复制到另一个文件夹
了解的应该都知道 (4.1)的操作要比(4.2)慢很多,因为每复制一个文件,要分配内存,创建操作句柄等额外工作,如果复制文件很多,会造成很大的性能开销。虽然渲染过程跟文件操作有很大不同,但也是很类似的,每次调用 Draw Call前,CPU 需要完成很多工作,当这些工作完成后,GPU 才能拿到渲染命令,其实GPU 的渲染能力是很强的,渲染 200个还是2000 个三角形通常没太大区别,因此GPU渲染速度往往快于CPU,所以当有大量 Draw CallCPU 往往消耗过载。

(5) 如何减少 Draw Call
尽管减少 Draw Call 方法有很多,我们在此只讨论 使用 批处理(Batching)、批处理(Batching)、批处理(Batching) 重要的事情 说三遍,到此才真正进入了正题。
(5.1)减少 Draw Call 的一个思路,把多个小的 DrawCall 合并为一个大的 Draw Call,这就是批处理(Batching)思想
(5.2)合批优化的是CPU还是GPU?
合批节省了CPU相关准备工作量,只是对CPU的优化,对GPU的影响不大

(6) Unity 提供了两种 批处理(Batching)方式
动态批处理(Dynamic Batching)
静态批处理(Static Batching)

需要在 Edit -> Player-> Other Settings 打开 Static Batching、Dynamic Batching 设置
Dynamic Batching 默认是不开启的
在这里插入图片描述

(6.1)动态批处理(Dynamic Batching)
开启 Edit -> Player-> Other Settings->Dynamic Batching 后,物体不需要做配置,复合条件的物体自动生效
限制条件:
(6.1.1)必须使用相同的材质(材质相同的物体,不同的只有顶点数据,可以将顶点数据合并在一起,再发送给GPU)
(6.1.2)顶点属性不能超过 900 个(不是Mesh 的顶点数,而是Shader使用的 顶点坐标、法线、UV坐标等属性总和不能超过 900,如果同时使用了顶点坐标、法线、UV坐标属性,则顶点数不能超过 900 除以 3 = 300个)
(6.1.3)多个 Pass 的 Shader 会破坏批处理

(6.2) 静态批处理(Static Batching)
开启:将物体 Inspector 面板右上角的 Static 勾选(实际只需要勾选 Batching Static)
在这里插入图片描述
原理:在运行开始阶段,把需要进行静态批处理的模型合并到一个新的网格中,意味着这些模型数据在运行时不能被移动
优点:只需要一次合并操作,效率高
缺点:占用更多的内存来存储合并后的数据

(7)查看
前提,在Unity 运行状态下查看
在这里插入图片描述
Unity 改版后 Game 视图 Stats 窗口
Batches:相当于 DrawCall
Saved by batching:通过批处理节省的 Draw Call
SetPass calls:跟Shader 中Pass 数量有关,Pass 越多,该值越大

另外一个查看
打开 Window->Analysis->Profiler
然后打开 Rendering 部分可以查看更多详细信息
在这里插入图片描述

还有一个查看
打开 Window->Analysis->Frame Debuger
点击面板上 Enable 按钮
在这里插入图片描述
可以看到中间上方滑动条 还有 1 of 15
15 既是 当前屏幕是由 15 个步骤将场景渲染到屏幕上的,可以拖动滑动条看每一步具体绘制出了那些物体,也可以在左侧一个一个选择查看绘制的物体

(8) 离线合批
上面说的 动态批处理(Dynamic Batching) 、静态批处理(Static Batching) 都是在运行时进行的,动态合批是需要实时合批,静态合批是合一次,但是占用双份内存
离线合批是在游戏制作期间,把需要合在一起的物体进行合并,这样就减少了运行时的计算处理
离线合批方式
(8.1)美术利用建模软件:3D Max、Maya 等 把一些可以合并的物体进行合并
(8.2)利用引擎插件工具,Unity 的一些合并工具

能提前做好合批的尽量提前做。
比如场景中有很多花草树木,他们模型面数一般都不多,贴图基本都是相同的,尽量不要做成 一个一个的花、草、树、木 放入场景,而是让美术在制作模型软件中提前把这些模型合并,虽然打开动态合批也是可以减少 Draw call 但是还是会消耗一些性能的

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

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

相关文章

使用Unit Scaling进行FP16 和 FP8 训练

Unit Scaling 是一种新的低精度机器学习方法,能够在没有损失缩放的情况下训练 FP16 和 FP8 中的语言模型。 使用FP16和BFLOAT16替代FP32可以将内存、带宽和计算需求的大幅减少,这也是目前越来越大的模型所需要的。 背景介绍 随着支持fp8的硬件的发展&…

webrtc入门系列(三)云服务器coturn环境搭建

《webrtc入门系列(一)easy_webrtc_server 入门环境搭建》 《webrtc入门系列(二)easy_webrtc_server 入门example测试》 《webrtc入门系列(三)云服务器coturn环境搭建》 《webrtc入门系列(四&…

测试题目气死人

服了差不多每一题都要错几个案例我真的服了wok,什么鬼东西!!! lx学长的羊圈 Description lx学长是一个养羊大户,有成千上百个羊圈。可是却一次也没来羊圈帮过忙,今天他被叫来羊圈给羊羊们施展成双成对大法…

力扣算法系统刷题题解记录

力扣算法系统刷题题解记录 文章目录力扣算法系统刷题题解记录前言一、数组704二分查找示意图:解题思路代码27.移除元素示意图解题思路代码前言 参考顺序和资料:《代码随想录》 二刷要认真做笔记啦,加油! 一、数组 704二分查找 …

2023-04-12 面试中常见的数组题目

数组中的问题其实最常见 通过基础问题,掌握写出正确算法的“秘诀”巧妙使用双索引技术,解决复杂问题对撞指针- 滑动窗口 1 从二分查找法看如何写出正确的程序 本节学习重点:处理边界问题! 1.确定边界范围方法,先用区…

13、Qt生成dll-QLibrary方式使用

Qt创建dll,使用QLibrary类方式调用dll 一、创建项目 1、新建项目->其他项目->Empty qmake Project->Choose 2、输入项目名,选择项目位置,下一步 3、选择MinGW,下一步 4、完成 5、.pro中添加TEMPLATE subdirs&#xff…

定时任务之时间轮算法

初识时间轮 我们先来考虑一个简单的情况,目前有三个任务A、B、C,分别需要在3点钟,4点钟和9点钟执行,可以把时间想象成一个钟表。 如上图中所示,我只需要把任务放到它需要被执行的时刻,然后等着时针转到这个…

IP协议(网络层重点协议)

目录 一、IP协议报头格式 二、地址选择 1、IP地址 (1)格式 (2)组成 (3)分类 (4)子网掩码 三、路由选择 IP协议是网络层的协议,它主要完成两个方面的任务&#xf…

4.16--设计模式之创建型之代理模式(总复习版本)---脚踏实地,一步一个脚印

1.代理对象 定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,从而实现对真实对象的操作。 通俗的来讲代理模式就是我们生活中常见的中介。 在代理模式中,代理对象主要起到一个中介的作用,…

初识Docker并在linux完成安装

文章目录一、 初识Docker1.1 简介1.2 Docker和虚拟机的异同1.3 Docker架构二、 DockerHub三、Docker的安装一、 初识Docker 1.1 简介 Docker是一种开源的容器化平台,可以让开发者在容器中打包、发布、运行和管理应用程序。它使用轻量级的容器来隔离应用程序和它们的…

Scrapy爬虫基本使用与股票数据Scrapy爬虫

Scrapy爬虫的常用命令 scrapy命令行格式 红色是常用的三种命令 为什么Scrapy采用命令行创建和运行爬虫? 命令行(不是图形界面)更容易自动化,适合脚本控制 本质上,Scrapy是给程序员用的,功能&#xff08…

vue打包之后,可以进行修改配置后端地址、端口等信息方法

前言 用vue-cli构建的项目通常是采用前后端分离的开发模式,也就是前端与后台完全分离,此时就需要将后台接口地址打包进项目中,但是,难道我们只是改个接口地址也要重新打包吗?当然不行了,那就太麻烦了&#…

支付宝沙箱环境+SpringBoot+内网穿透整合开发

目录 1.查看沙箱账号 2.内网穿透 3.沙箱环境整合SpringBoot开发 下面我将以实际案例详细介绍如何使用沙箱环境进行支付宝支付对接的开发 1.查看沙箱账号 首先什么是沙箱账号? 沙箱账号是指在支付宝沙箱环境中创建的测试账户,用于模拟真实的支付流程…

The 2022 ICPC Asia Xian Regional Contest

题目顺序大致按照难度排序。 F. Hotel 现在酒店中有单人间和双人间,价格分别是c1,c2,现在有n个队,每队三个人,性别分别用字母表示,当两个人性别相同且在同一个队时,他们可以住在双人间中。求最…

【跑跑Github开源项目系列】基于YOLO和Streamlit的车辆识别系统demo

【跑跑Github开源项目系列】基于YOLO和Streamlit的车辆识别系统demo写在前面环境配置创建虚拟环境安装库项目运行写在前面 相信很多朋友跟我一样在github等平台上偷代码 (读书人的事怎么能叫偷呢) 的时候会发现伟大且无私的作者虽然开源了代码但是readme文件该写的没写&#x…

2023TYUT移动应用软件开发程序设计和填空

目录 程序设计 程序设计1:根据要求设计UI,补充相应布局文件,即.xml文件 程序设计2:根据要求,补充Activity.java文件 程序填空 说明: 程序设计 程序设计1:根据要求设计UI,补充相应布局文件,即.xml文件…

【C++初阶】第十篇:list模拟实现

文章目录一、list的模拟实现三个类及其成员函数接口总览结点类的模拟实现迭代器类的模拟实现迭代器类的模板参数说明迭代器operator->的重载迭代器模拟实现代码list的模拟实现无参构造函数带参构造拷贝构造函数赋值运算符重载函数析构函数begin和endinserteraselist的迭代器…

WordPress添加阿里云OSS对象云储存配置教程

背景:随着页面文章增多,内置图片存储拖连网站响应速度,这里对我来说主要是想提升速度 目的:使用第三方云存储作为图片外存储(图床),这样处理可以为服务器节省很多磁盘空间,在网站搬家的时候减少文件迁移的工…

【数据结构】堆(笔记总结)

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&…

MySQL--数据库基础--0406

目录 1.什么是数据库? 2. 基本使用 2.1 连接服务器 2.2 数据库的操作在Linux中的体现 2.3 使用案例 3.服务器,数据库,表关系 4.数据逻辑存储 5.SQL的分类 6.存储引擎 1.什么是数据库? 数据库和文件 文件或者数据库&…