首页 > 编程知识 正文

unity dropdown,coreldraw软件

时间:2023-05-06 08:50:36 阅读:20960 作者:622

在实际的项目开发中,说到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进行大量计算并影响游戏

三、如何优化DrawCall?

1 .关于写真集、材质、等级的处理,减少绘制调用

要看到这些如何优化,就需要了解他们的工作原理。 以NGUI为例,说明一下他们的关系吧。

NGUI主要由三个主要模块组成: ui面板、ui构件和UIDrawcall。 其中ui面板用于管理ui构件控件和UIDrawcall,ui构件是所有组件的基类。

NGUI框架具有一个包含所有面板的静态列表,每个面板下都存储自己的ui构件和UIDrawCall。 也就是说,每次绘制时,panle都会遍历它下面的所有级别的子对象,直到搜索结束;遇到新Panel时,它会跳出当前分支,继续搜索所有分支,因此在实际运行中,每次都是这样此时,如果多个连续UI小部件使用的材质和纹理匹配,则共享一个绘制调用。 让我给你看看具体情况。

这是使用不同的材质和纹理时的情况

因为这是使用相同的材质和纹理的情况,所以很多人认为有相同的插图集会占用相同的绘制调用。 在上图的分析中,我们发现不仅要使用相同的插图集,而且要使用相同的素材在相同的panel下。 否则,再次调用DrawCall。 请注意,即使使用相同的贴图集、材质,但如果中途混合了其他渲染状态,也会再次调用DrawCall。

另外,还需要注意的是,如果在panel下有动态物体,则为了实现某种效果,需要UI的位置移动。 在这种情况下,最好是动态分离。 因为只要UI在面板下移动,panle就会对在清空之前保存的UI构件和UIDrawCall重新进行渲染,从而浪费性能。 一些同学会说,这是不是增加了DrawCall

因此,要在界面中布局UI,必须规划图形集和标高以减少绘制调用次数。

2 .关于批处理

批处理正如文字所示,是指一张处理多个物体,什么样的东西都可以批处理吗? 答案是使用同样材质的物体。 unity有两种方法:动态批处理和静态批处理。 动态批处理的好处是,一切都是自动处理的,物体可以移动,但限制很多,具体分析有哪些限制。 静态批处理具有自由度高、约束少的优点,但不能占用更多内存和移动批处理对象。

首先对动态批处理进行说明,物体使用相同的材质,满足对应的特定条件后,unity会自动进行动态批处理。

在此,在动态批处理中,可以看出有4个物体,但只占用了3个DrawCall。 unity执行动态批处理,两个

cube只占用了一个DrawCall。

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

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

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

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

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

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

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

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

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。