Unity静态合批处理详解

这篇具有很好参考价值的文章主要介绍了Unity静态合批处理详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

静态批处理的原理

静态合批最重要的一件事就是合并网格。
在运行前 或是 发布前,场景中相同材质,并且标记为 Batching Static(自动静态合批)或者通过代码调用合并函数(StaticBatchingUtility.Combine 手动静态合批)的物体,引擎会把网格信息取出来,之后对网格上的顶点进行空间变换,变换到同一坐标系下,合并成一个新的大网格。

形成新的大Vertex Buffer Object(VBO 顶点缓冲对象)和Index Buffer Object(IBO 索引缓冲对象)(这两个缓冲区一旦确定了就不会再被修改了),最终会在一个批次中提交这些顶点信息。(如果之后需要对合并的网格进行空间变换,由于已经在同一坐标系了,所以直接对合并的节点进行矩阵变换即可)。

静态批处理到底会不会减少DC

这个缓存会记录着每一个 渲染对象的 IBO 的范围,然后在遍历每个渲染对象前,先设置他们同一个渲染状态(也就是材质信息要一致的原因),然后再逐个遍历渲染对象的 IBO,再调用类似 glDrawElement 的 API 来绘制即可,绘制前,要判断这个 渲染对象时是否在视锥体内,如果不在,就不绘制。所以静态合批不是减少 DC,而是减少 DrawState 的设置,在 unity 就是减少 SetPassCall 的设置

静态合批虽然合并网格,从而在一个批次中提交更多的顶点信息,虽然可以有效减少Batch次数和渲染状态SetPassCall的改变次数。但是这并不意味着这一个批次中只有一个DC。

举个例子,在一个合并过的网格中,因为场景中物体的可见性,需要大网格中的某一部分发生剔除或是被隐藏时,其对应Vertex Buffer和Index Buffer并不会被修改,引擎会选择将整个大网格拆分成若干个小部分来进行分次渲染,每次小渲染都是一个DC,通过调整每个DC来跳过不显示的内容,由于这些子物体共享Material,所以渲染状态/绘制命令并没有切换,调用DC时会缓存绘制命令到Command Buffer,还是起到了优化的目的。

所以静态合批并不减少Draw call的数量但是在编辑器时由于计算方法区别Draw call数量是会显示减少了的,但是由于我们预先把所有的子模型的顶点变换到了世界空间下,并且这些子模型共享材质,所以在多次Draw call调用之间并没有渲染状态的切换,渲染API会缓存绘制命令,起到了渲染优化的目的。另外,在运行时所有的顶点位置处理不再需要进行计算,节约了计算资源。

静态批处理的劣势

Unity会把合并网格的相关信息存在场景文件(.scene)下,所以对于那些存在静态物体的场景文件一般来说会大很多。并且不仅仅是文件增大,在运行时,静态合批的网格会常驻内存,如果存在大量的静态合批网格,那么内存压力会十分可怕。它实际上是属于空间换时间的一种策略。由于静态合批的Buffer既增加运行时内存又增加包体,所以还可以采取运行时进行静态合批的策略,用第一次加载的内存和时间换包体大小。

参考游戏图形批量渲染及优化:Unity静态合批技术 | indienova 独立游戏

【Unity游戏开发】合批优化汇总 - 知乎

unity 减少drawcall_unity scroll - 腾讯云开发者社区-腾讯云

关于静态批处理/动态批处理/GPU Instancing /SRP Batcher的详细剖析 - 知乎文章来源地址https://www.toymoban.com/news/detail-421115.html

到了这里,关于Unity静态合批处理详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JDBC p4 批处理

    基本介绍: 当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。 JDBC的批量处理语句包括下面方法: addBatch():添加需要批量处理的SQL语句或参数; executeBatch():执行批量

    2024年02月15日
    浏览(43)
  • BAT 批处理脚本教程

    第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。 小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。 了解了大概意思后

    2024年02月02日
    浏览(52)
  • 【bat】批处理脚本大全

    目录 1.概述 2.变量 3.运算符 3.2.重定向运算符 3.3.多命名运算符 3.4.管道运算符 4.命令 4.1.基本命令 4.2.参数传递 4.3.查看脚本内容 4.4.注释 4.5.日期和时间 4.6.启动脚本 4.7.调用其他bat 4.8.任务管理 4.8.1.任务列表查看 4.8.2.任务终止 4.9.文件夹 4.10.关机 4.11.环境变量 4.12.目录 4.12.1

    2024年02月04日
    浏览(55)
  • 大数据处理平台的架构演进:从批处理到实时流处理

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:大数据系列 ✨文章内容:大数据框架演进 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 大数据处理平台的架构演进经历了从批处理到实

    2024年02月10日
    浏览(49)
  • 初探Flink的Java实现流处理和批处理

    端午假期,夏日炎炎,温度连续40度以上,在家学习Flink相关知识,记录下来,方便备查。 开发工具 :IntelliJ Idea Flink版本 :1.13.0 本次主要用Flink实现 批处理 (DataSet API) 和 流处理 (DataStream API)简单实现。 第一步、创建项目与添加依赖 1)新建项目 打开Idea,新建Maven项目

    2024年02月10日
    浏览(53)
  • Windows下批处理删除文件

    最近我使用Maven的时候会出现下载jar包不成功的现象,然后需要把它删除然后重新下载,但是有时候文件过多,一个个删除太花费时间,所以用bat的批处理会很舒服。 bat的语法我之前没遇到过,然后我是边学习边试验,写出了一个简陋版的批处理文件。 我的思路是: 1、遍历

    2024年02月13日
    浏览(57)
  • Spring Batch 批处理框架

    Spring Batch 是一个轻量级、全面的批处理框架,旨在支持开发对企业系统的日常操作至关重要的健壮的批处理应用程序。Spring Batch 建立在人们期望的 Spring Framework 特性(生产力、基于 POJO 的开发方法和一般易用性)的基础上,同时使开发人员可以在必要时轻松访问和使用更高

    2024年02月12日
    浏览(42)
  • .bat批处理打开多个程序

    作为程序员每天开机都需要打开idea、数据库、xshell等开发软件,操作相对繁琐,于是想起了批处理来帮忙一键启动。 在桌面新建一个txt文件,改后缀名为.bat,并加上下面的代码。 代码一(推荐) 代码执行流程 点击bat文件后先执行第一个语句进入到相应的目录。 执行第二个

    2024年02月11日
    浏览(47)
  • 批处理(Batch Processing)概念

    批处理(Batch Processing)这一概念在不同上下文中可有不同的含义: 传统操作系统层面 : 在早期的操作系统中,批处理是指一种处理模式,用户将一系列作业(job)按照一定的顺序组织起来,提交给操作系统一次性处理。这种模式下,操作系统不与用户交互,而是连续不断地

    2024年03月21日
    浏览(47)
  • MyBatis批处理,使用foreach

    测试代码: 批量插入数据的局限性: 无法获取插入数据的id 批量生成的SQL太长,可能会被服务器拒绝 测试代码

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包