IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 又是2年了,更新些自学的优化知识 -> 正文阅读

[游戏开发]又是2年了,更新些自学的优化知识

时间2021年12月29日,距离学习后到毕业已经过去3年时间了。这3年也在一直用Unity开发一些2D游戏,但感觉自己的技术一直没有什么精进。是时候静下心来,反思一下自己的过往,并继续拿出刚入行时的气势,去学习一些新东西了。今天主要是记录下,自己学习的关于DrawCall的知识。

首先,DrawCall就是渲染一次拥有一个网格并携带一种材质的物体便会使用一次Draw Call。可以理解为调用一次DC就换一种画笔在画板上画一个物体。具体过程就是:设置颜色-->绘图方式-->顶点坐标-->绘制-->结束,所以在绘制过程中,如果能在一次DrawCall完成所有绘制就会大大提高运行效率,进而达到优化的目的。

然后,每次调用DrawCall之前,CPU又会发送一大堆内容给GPU,其中包括渲染方法,要渲染的物体等等。第一步:将要渲染的物体从硬盘加载到内存,再从内存加载到显存,方便GPU使用。第二步:设置好要渲染的状态,也就是对应物体的材质,纹理,着色器等。第三步:渲染输出图元,并向GPU发送DrawCall指令,进行渲染。由此可见,如果DrawCall命令过多,会导致我们的程序运行效率降低。

一、相同材质和纹理的UI素材打包成图集

在降低Drawcall方面,一个非常重要的概念就是Batch,因为一次Drawcall相当于CPU与GPU进行一次沟通的成本,如果CPU能一次多打包一些信息给GPU,那么Drawcall数量自然就下来了,这个打包传输信息给GPU的过程就叫做Batch,批处理。那么什么情况下这些信息可以打包呢?从uGUI的角度,如果你的UI中组件的材质与纹理均相同,这几个组件就可以被Batch。在Image组件中,材质对应Source Image,纹理则对应Material;在Text组件中材质对应Font,纹理也是Material。

? ? ? ?然后,我们根据上面的批处理方法,可以将一些UI元素打包成一张图集,一次性传给GPU,然后根据不同位置,让GPU渲染不同的图,这样就可以在1次Drawcall中完成大部分UI素材的显示,从而减少DrawCall,增加性能。

二、注意渲染层级问题

? ? ? ?但在批处理中,也会存在一些层级的问题,这也是需要注意的点。例如,在同一个Canvas下绘制A,B,C这3个UI,已知AB为相同材质和纹理,而C为不同材质。此时渲染后DrawCall理应为2。但如果变换Canvas下层级顺序,变为绘制A,C,B,则DrawCall会变为3。具体原因是,批处理的过程中,AB虽然相同,但中间夹杂了C物体,导致CPU重复给GPU多发送了一次DrawCall。下面是看大神总结的Canvas层级计算方式。UGUI性能优化之Drawcall详解_Aison_的博客-CSDN博客_ugui优化

同一个Canvas内,UGUI的层级计算方式:
1、一个UI元素,在它所占的屏幕范围内(通常是矩形),如果没有任何UI在它的底下,那么它的层级号就是0(最底下);
2、如果一个UI在其底下且该UI可以和它合批,那它的层级号与底下的UI层级一样;
3、如果一个UI在其底下但是无法与它Batch,那它的层级号为底下的UI的层级+1;
4、如果有多个UI都在其下面,那么按前两种方式遍历计算所有的层级号,其中最大的那个作为自己的层级号。

三、注意尽量少使用实时光照

Unity DrawCall详解_yu1368072332的博客-CSDN博客_drawcall

以上内容,都是这位大佬总结的,我只是写个观后感,方便自己记住。当然,如果大家有什么更好的降低DrawCall的方法,也可以回复我。感谢!!!


?

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 14:17:32  更:2022-01-01 14:19:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 20:30:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码