| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> Unity 性能优化之合批 -> 正文阅读 |
|
[游戏开发]Unity 性能优化之合批 |
前言动态合批与静态合批其本质是对将多次绘制请求,在允许的条件下进行合并处理,减少cpu对gpu绘制请求的次数,达到提高性能的目的。 首先,啥是合批?批量渲染其实是个老生常谈的话题,它的另一个名字叫做“合批”。在日常开发中,通常说到优化、提高帧率时,总是会提到它。 为啥要合批?批量渲染是通过减少CPU向GPU发送渲染命令(DrawCall)的次数,以及减少GPU切换渲染状态的次数,尽量让GPU一次多做一些事情,来提升逻辑线和渲染线的整体效率。但这是建立在GPU相对空闲,而CPU把更多的时间都耗费在渲染命令的提交上时,才有意义。 调用Draw Call性能消耗原因是啥?我们的应用中每一次渲染,进行的API调用都会经过Application->Runtime->Driver->显卡(GPU),其中每一步都会有一定的耗时。 每次调用DC 将一些没有必要马上发送给Driver的命令缓冲起来,在适当的时机一起发送给Driver 解决渲染Batch过多的主要方法:
合批优化的是CPU还是GPU?合批是节省了CPU的相关准备工作的工作量。 合批后,经过VS,PS,尝试测试,模板测试后,此时已没有了纹理,顶点,索引的概念,只剩下一个个孤立的像素,各像素间没有任何关系了。像素送到GPU后进行批量处理,呈现到屏幕硬件上。因此合批与GPU没有任何关系,也几乎没有影响。不管是一批还是多批,最终在此帧送到GPU的像素数量是相等的,数据是相同的。合批与否,对GPU的影响仅是像素到达的慢了还是快了,几乎不影响GPU的性能 目前比较新的图形API如:DirectX12、Vulkan、Metal,在Driver上的性能消耗已经降低了很多。但是通过合批来降低渲染的Draw call仍然是十分必要的。这也是我们对Draw call优化唯一能够做的事情。接下来我们介绍一下几种常见的合批处理。 合批技术分离线合批和实时合批。一、离线合批(Offline Batch)离线合批就是在游戏运行前,先用工具把相关资源做合批处理,以减轻引擎实时合批的负担。 适合离线合批的是静态模型和场景物件。如场景地表装饰面:石头/砖块等等。 离线合批方式有:
二、实时合批(Runtime Batch)Unity引擎内建了两种合批渲染技术:Static batching(静态合批)和Dynamic batching(动态合批)。 2.1 静态合批(Static batching)静态合批是勾选Static,Unity在Build的时候,会自动下生成合并的网格,并将它以文件形式存储合并后的数据,这样在当场景被加载时,一次性提交整个合并模型的顶点数据,根据引擎的场景管理系统判断各个子模型的可见性。然后设置一次渲染状态,调用多次Draw call分别绘制每一个子模型。 2.1.1 使用 PlayerSettings中开启static batching,对需要静态合批物体的Static打钩即可 通过勾选开关标记单位参与静态合批 2.1.2 前提: 共享相同的材质 2.1.3 优点 静态合批采用了以空间换时间的策略来提升渲染效率。 静态合批并不减少Draw call的数量,但是由于我们预先把所有的子模型的顶点变换到了世界空间下,并且这些子模型共享材质,所以在多次Draw call调用之间并没有渲染状态的切换,渲染API会缓存绘制命令,起到了渲染优化的目的。另外,在运行时所有的顶点位置处理不再需要进行计算,节约了计算资源。 2.1.4 缺点 包含静态合批的场景体积大了一丢丢
2.2 动态合批(Dynamic batching)动态合批是专门为优化场景中共享同一材质的动态GameObject的渲染设计的。目标是以最小的代价合并小型网格模型,减少Drawcall。 动态合批的原理也很简单,在进行场景绘制之前将所有的共享同一材质的模型的顶点信息变换到世界空间中,然后通过一次Draw call绘制多个模型,达到合批的目的。模型顶点变换的操作是由CPU完成的,所以这会带来一些CPU的性能消耗。 2.2.1 使用 Unity自动处理 2.2.2 前提 共享相同的材质 2.2.3 限制 1,900个顶点以下的模型。 除了上面这两种合批技术外,Unity还有一些其他合批技术,这边只做介绍,不进行展开 运行时静态合批(Static Batching In Runtime):其实就是运行时手动代码合批。 三、GPU Instancing 简单介绍GPU Instancing 没有动态合批那样对网格数量的限制,也没有静态网格那样需要这么大的内存,它很好的弥补了这两者的缺陷,但也有存在着一些限制,我们下面来逐一阐述。 与动态和静态合批不同的是,GPU Instancing 并不通过对网格的合并操作来减少Drawcall,GPU Instancing 的处理过程是只提交一个模型网格让GPU绘制很多个地方,这些不同地方绘制的网格可以对缩放大小,旋转角度和坐标有不一样的操作,材质球虽然相同但材质球属性可以各自有各自的区别。 但是旧版本显卡可能不支持,自己写Shader也需要开启GPU Intancing 支持如下图: ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/16 20:55:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |