unity drawcall怎么看_unity scrollview

unity drawcall怎么看_unity scrollview在实际项目开发中,提起unity优化,肯定是有DrawCall的相关内容的,下面就讲解一下什么是DrawCall以及如何对DrawCall进行优化操作。一、什么是DrawCall?    在unity中,每次CPU准备数据并通知GPU的过程就称之为一个DrawCall。    具体过程就是:设置颜色–>绘图方式–>顶点坐标–>绘制–>结束…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在实际项目开发中,提起unity优化,肯定是有DrawCall的相关内容的,下面就讲解一下什么是DrawCall以及如何对DrawCall进行优化操作。

一、什么是DrawCall?

        在unity中,每次CPU准备数据并通知GPU的过程就称之为一个DrawCall。

        具体过程就是:设置颜色–>绘图方式–>顶点坐标–>绘制–>结束,所以在绘制过程中,如果能在一次DrawCall完成所有绘制就会大大提高运行效率,进而达到优化的目的。

二、DrawCall为什么会影响游戏运行效率?

说道为什么会影响效率,就首先要了解一下他的工作原理:为了CPU和GPU可以进行并行工作,就需要一个命令缓冲区,就是由CPU向其中添加命令,然后又GPU从中读取命令,这样就实现了通过CPU准备数据,通知GPU进行渲染。

在每次调用DrawCall之前,CPU需要向GPU发送很多内容,主要是包括数据,渲染状态(就是设置对象需要的材质纹理等),命令等。CPU进行的操作具体就是:

  • 准备渲染对象,然后将渲染对象从硬盘加载到内存,然后从内存加载到显存,进而方便GPU高速处理
  • 设置每个对象的渲染状态,也就是设置对象的材质、纹理、着色器等
  • 输出渲染图元,然后向GPU发送DrawCall命令,并将渲染图元传递给GPU

所以如果DrawCall数量过多就会导致CPU进行大量计算,进而导致CPU的过载,影响游戏运行效率。

三、如何优化DrawCall?

1.关于图集、材质、层级的处理,减少DrawCall

想看这些如何进行优化,就需要对他们的工作原理进行理解一下。下面我们以NGUI为例,讲解一下他们之间的关系:

NGUI主要是有三大模块组成:UIPanel,UIWidget,UIDrawcall组成,其中UIPanel是用来管理UIWidget控件和UIDrawCall,而UIWidget是所有组件的基类。

在NGUI框架中,会有一个静态的list用来存放所有的Panel,然后每个单独的Panel下会保存自己的UIWidget和UIDrawCall,就是在每次绘制的时候panle会遍历自己下面的所有层级下的子物体,直到查找结束,或者遇到新的panel会跳出当前分支,继续寻找其他分支,直到全部查找结束。所以说在实际运行中,每次都会为一个UIWidget绘制一个DrawCall,如果这时候连续的多个UIWidget使用的材质和纹理一致,就会公用一个DrawCall,下面给大家看下具体的情形:

unity drawcall怎么看_unity scrollview
这是使用不同材质和纹理的情况

 

unity drawcall怎么看_unity scrollview
这是使用相同的材质和纹理的情况​​​​​​

所以并不是好多人的认知是只要同一个图集就会占用同一个DrawCall,通过上图分析发现不光是要使用同一个图集,还要使用同样的材质在同一个panel下才可以,否则就会重新进行调用一次DrawCall。另外需要注意的是,如果使用同一个图集、材质,但是中间夹杂了其他的渲染状态,也会导致重新调用一次DrawCall。

另外还需要注意一点就是在panel下如果动态的物体,就是为了实现某种效果,需要UI 进行位置移动,这种情况下,最好做成动态分离,因为只要panle下UI有移动,panle就会对清空之前的保存的UIWidget和UIDrawCall,重新进行渲染,这样就会造成性能浪费,有的同学会说这样不是增加了DrawCall吗,但是相对于每次都重新绘制,应该还是会更加节省性能的吧,你说呢?

所以说在对UI进行界面排布就需要对图集和层级做好规划,进而减少DrawCall次数。

2.关于批处理

批处理从字面意思就是一块处理多个物体的意思,但是是什么样的都可以进行批处理吗?答案就是使用同一个材质的物体才可以。unity中有个两种批处理方式,动态批处理和静态批处理。对于动态批处理来说,好处就是一切都是自动处理的,并且物体是可以移动的,但是限制颇多,具体有哪些限制下面会进行分析。对于静态批处理来说,好处就是自由度很高,限制条件少,但是它会占用更多的内存,并且经过批处理的物体不可以在进行移动。

首先说一下动态批处理,条件是物体使用同一个材质,并且满足对应的特定条件,unity就会自动为我们做动态批处理。

unity drawcall怎么看_unity scrollview

这里可以看到动态批处理中,四个物体但是只占用了三个DrawCall,就是unity进行了动态批处理,两个cube只占用了一个DrawCall。

下面说下动态批处理限制:

  • 顶点属性最大限制900,
  • 使用lightmap的物体不行进行批处理
  • 使用MultiplePass的shader也不会进行批处理
  • 接受实时阴影的物体也不会进行批处理

下面说下静态批处理, 静态批处理前提当然也是使用了同一个材质,然后就是讲对应的对象设置为static:

unity drawcall怎么看_unity scrollview

这时你会发现DrallCall变为1了,这就是静态批处理的作用,但是这时候你会发现VBO Total比刚才大了,这就是静态批处理坏处,通过内存来换取性能,下面我们看下官方的解释:

如果在静态批处理前有一些物体共享了相同的网格(例如这里的两个箱子),那么每一个物体都会有一个该网格的复制品,即一个网格会变成多个网格被发送给GPU。在上面的例子看来,就是VBO的大小明显增大了。如果这类使用同一网格的对象很多,那么这就是一个问题了,这种时候我们可能需要避免使用静态批处理,这意味着牺牲一定的渲染性能。例如,如果在一个使用了1000个重复树模型的森林中使用静态批处理,那么结果就会产生1000倍的内存,这会造成严重的内存影响。
 

3.减少实时光的使用以及阴影效果

同样的设置,但是如果你将灯光的阴影效果打开,你会发现DrawCall大幅增加:

unity drawcall怎么看_unity scrollview

所以在项目中,如果想让场景更加完美,可以使用lightmap满足你想要的阴影效果。

综上所述就是要对图集进行和层级处理要做好整体规划,尽量将材质纹理合并,对于灯光的根据当前情况做好相应处理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191668.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 虚拟机连不上网所有可能我都遇到

    虚拟机连不上网所有可能我都遇到ping不通,主机访问不了虚拟机等等等等虚拟机ping不通VWnet8的ip、ping不通网关、ping不通百度、yum出现tryothermirror。虚拟机ping不通VWnet8的ip、ping不通网关、ping不通百度、yum出现tryothermirror。首先要编辑虚拟机网络为NAT模式,并设定网关、子网掩码。然后进入NAT设置里,将允许任何组织唯一标识符勾选,这个有时候系统默认没钩。然后进入DHCP设计起始ip和结束ip。进入本地网络,修改VWnet8适配器右键属性

    2022年6月26日
    30
  • kali安装步骤失败 选择并安装软件_kali怎么装arpspoof

    kali安装步骤失败 选择并安装软件_kali怎么装arpspoof1.在我刚刚安装好kali系统后,使用arpspoof命令显示无此命令这时需要安装,于是百度下来的结果:apt-getinstalldsniffssldump2.但是会出现:“E:无法定位软件包问题”于是百度上大佬的解决办法是:更新:source.list文件中是有关Ubuntu软件更新的源服务器的地址,默认为Ubuntu官方地址,为提高速度我们可以修改为其他服务器地址cd/e…

    2022年10月6日
    2
  • Linux内核解压

    Linux内核解压linux内核解压说明:首先下载内核linux-4.12.4.tar.xz然后下载工具7z.rar然后用winrar解压7z.rar然后安装7z然后用7z解压linux-4.12.4.tar.xz得到linux-4.12.4.tar最后用winrar解压

    2022年7月23日
    12
  • 百度面试题

    百度面试题1.一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。这道题的解答请看下一篇日志2.一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对,如abc和

    2022年7月15日
    24
  • Spring学习——Spring IOC 学习整理资料整理

    自己动手写个spring IOC容器 http://blog.csdn.net/u010837612/article/details/50686573 XPath 语法 http://www.runoob.com/xpath/xpath-syntax.htmlspring ioc原理(看完后大家可以自己写一个spring) http://blog.csdn.net/it_man/artic

    2022年2月26日
    41
  • 大数据中数据采集的几种方式

    大数据中数据采集的几种方式一、采集大数据的方法1.1通过系统日志采集大数据用于系统日志采集的工具,目前使用最广泛的有:Hadoop的Chukwa、ApacheFlumeAFacebook的Scribe和LinkedIn的Kafka等。这里主要学习Flume。Flume是一个高可靠的分布式采集、聚合和传输系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据,同时对数据进行简单处理,并写到诸如文本、HDFS…

    2022年5月20日
    66

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号