了解的近义词_draw calls

了解的近义词_draw calls一、什么是DrawCallDrawCall的含义就是CPU调用图像编程接口,以命令GPU进行渲染的操作。CPU和GPU通过使用一个命令缓冲区实现并行工作。命令缓冲区包含一个命令队列,CPU向其中添加命令,GPU从中读取命令,添加和读取是相互独立的,因此使得CPU和GPU可以独立工作。命令缓冲区中的命令有很多种类,DrawCall就是其中一种。二、为什么Dr…

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

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

一、什么是DrawCall  

    DrawCall的含义就是CPU调用图像编程接口,以命令GPU进行渲染的操作。

    CPU和GPU通过使用一个命令缓冲区实现并行工作。命令缓冲区包含一个命令队列,CPU向其中添加命令,GPU从中读取命令,添加和读取是相互独立的,因此使得CPU和GPU可以独立工作。命令缓冲区中的命令有很多种类,DrawCall就是其中一种。

二、为什么DrawCall多了会影响帧率

    DrawCall中真正造成性能问题的元凶是CPU。

    在每次调用DrawCall之前,CPU需要向GPU发送很多内容,包括数据、状态和命令等。在这一阶段,CPU需要完成很多工作,例如检查渲染状态等。而一旦CPU完成了这些准备工作,GPU就可以开始本次渲染。GPU的渲染能力很强,渲染速度往往快于CPU提交命令的速度。如果DrawCall的数量太多,CPU就会把大量时间花费在提交DrawCall上,造成CPU的过载。

三、DrawCall优化

    优化有一下几个解决方案:

        1、使用Draw Call Batching,也就是批处理。Unity在运行时可以将一些物体进行合并,从而用一个DrawCall来渲染他们。具体下面会介绍。

        2、通过把纹理打包成图集来尽量减少材质的使用。

        3、尽量少的使用反光,阴影之类的,因为那会使物体多次渲染。

    Draw Call Batching技术

    Unity内置了Draw Call Batching技术,它的主要目标就是在一次DrawCall中批量处理对个物体。只要物体的变换和材质相同,GPU就可以按完全相同的方式进行处理,即可以把它们放在一个Draw Call中。

    Draw Call Batching技术存在缺陷,当它需要把一个Batch中的所有物体组合到一起,相当于创建了一个与这些物体加起来一样大的物体。这就需要分配相应大小的内存,也需要消耗CPU时间。特别是对于移动的物体,每一帧都得重新进行组合。但对于静止不动的物体,只需要进行一次组合。

    Unity提供了Dynamic Batching和Static Batching两种方式。

    Dynamic Batching

    Dynamic Batching是完全自动进行的,不需要也无法进行任何干预。

    动态批处理的约束:

        1、批处理动态物体需要在每个顶点上进行一定的开销,所以动态批处理仅支持小于900顶点的网格物体。

        2、如果着色器使用顶点位置,法线和UV值三种属性,那么只能批处理300顶点以下的物体;如果着色器需要使用顶点位置,法线,UV0,UV1和切向量,那么只能批处理180顶点以下的物体。

        3、不要使用缩放,分别拥有缩放大小(1,1,1)和(2,2,2)的两个物体将不会进行批处理。

        4、统一缩放的物体不会和非统一缩放的物体进行批处理。

        5、使用缩放尺度(1,1,1)和(1,2,1)的两个物体将不会进行批处理,但是使用缩放尺度(1,2,1)和(1,3,1)的两个物体将可以进行批处理。

        6、使用不同材质的实例化物体将会导致批处理失败。

        7、拥有lightmap的物体含有额外(隐藏)的材质属性,比如:lightmap的偏移和缩放系数等。所以,拥有lightmap的物体将不会进行批处理(除非他们指向lightmap的同一部分)。

         8、多通道的shader会妨碍批处理操作。比如,几乎unity中所有的着色器在前向渲染中都支持多个光源,并为它们有效地开辟多个通道。

         9、预设体的实例会自动地使用相同的网格模型和材质。  

    Static Batching

    Static Batching需要把静止的物体标记为Static,然后无论大小,都会组成Batch。

    如何对动态加载的静态物体进行静态合批操作:
    GameObject go = (GameObject)Instantiate(…);
    go.isStatic = true;//将实例化的物体设置为静态
    go.transform.parent = root.transform;
    gosList.Add(go);
    gos = gosList.ToArray(); 
    StaticBatchingUtility.Combine(gos, root);静态合并

    高效利用Draw Call Batching

    1. 首先是尽量减少场景中使用的材质数量,即尽量共享材质,对于仅纹理不同的材质可以把纹理组合到一张更大的纹理中。

    2. 然后是把不会移动的物体标记为Static。此外还可以通过CombineChildren脚本(StandardAssets/Scripts/UnityScripts/

CombineChildren)手动把物体组合在一起,但这个脚本会影响可见性测试,因为组合在一起的物体始终会被看作一个物体,从而会增加GPU要处理的几何体数量,因此要小心使用。

    3. 对于复杂的静态场景,还可以考虑自行设计遮挡剔除算法,减少可见的物体数量同时也可以减少Draw Call。

 

    NVIDIA 在 GDC 曾提出,25K batchs/sec 会吃满 1GHz 的 CPU,100的使用率。所以他们推出了一条公式,来预估游戏中大概可以 Run 多少个 Batch:
    了解的近义词_draw calls 
    举个例子:如果你的目标是游戏跑30FPS、使用2GHz的CPU、20%的工作量拨给Draw Call来使用,那你每帧可以有多少Draw Call呢?
333 Batchs/Frame = 25K * 2 * (0.2/30)

 

 

参考资料:https://blog.csdn.net/zhongdong00/article/details/80590396

 

转载于:https://www.cnblogs.com/chia-liblog/p/11007124.html

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

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

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


相关推荐

  • 利用R语言画图时添加希腊符号标注

    我们在画图时往往需要添加一些图形标注,例如,x坐标轴的含义,y坐标轴的含义,图例等。标注中的普通的英文符号自不待说,将希腊符号添加在标注中往往是各种画图工具需要特别处理的地方。在LaTeX、Matlab中画出这些希腊符号标注,我已经尝试过,并且使用它们已经有一段日子了,关键是如何R中画出这些希腊符号。R是一个开源的以编程语言方式提供的(本身也称为R语言)可以与其他类似软件相媲美的统计计算软件包

    2022年4月14日
    179
  • python lambda表达式 if_Python学习-lambda表达式

    python lambda表达式 if_Python学习-lambda表达式lambda只是一个表达式,函数体比def简单很多。lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。#求三个数的和1f=lambdax,y,z:x+y+x2print(f(1,2,3))#434f=lambdax,y,z:x+y+z5print(…

    2022年10月18日
    5
  • 【Swift】学习笔记(四)——设置(Collection)

    【Swift】学习笔记(四)——设置(Collection)

    2022年1月4日
    44
  • 对抗攻击经典论文剖析(上)【FGSM、BIM、PGD、Carlini and Wagner Attacks (C&W)】

    对抗攻击经典论文剖析(上)【FGSM、BIM、PGD、Carlini and Wagner Attacks (C&W)】最近做数据增广做的心累,想要看一看对抗攻击!这个博文会对四种经典算法进行剖析,分别是FGSM、BIM、PGD、CarliniandWagnerAttacks(C&W)。对抗攻击和防御首先我们简单来说一说对抗攻击和防御的目的。攻击就是对原始样本增加扰动生成对抗版本最大化损失函数,同时扰动尽可能地小,让人类肉眼无法察觉;防御问题是基于这种攻击方法训练一个更具鲁棒性的神经网络。数学表…

    2025年6月14日
    3
  • java中的继承详解

    java中的继承详解继承的描述在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如猫和狗都属于动物,程序中便可以描述为猫…

    2022年7月7日
    20
  • java是什么?java能用来干嘛?[通俗易懂]

    java是什么?java能用来干嘛?[通俗易懂]java是什么?java能用来干嘛?Java是一种开发语言(核心特点:跨平台,面向对象,名称由来看这里:J2EE里面的2是什么意思),对于开发者来讲,Java基本等于Jdk。Java由四方面组成:Java编程语言,即语法。Java文件格式,即各种文件夹、文件的后缀。Java文件格式,即各种文件夹、文件的后缀。Java虚拟机(JVM),即处理*.class文件的解释器。Java应…

    2022年7月7日
    23

发表回复

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

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