什么是DrawCall?「建议收藏」

前言游戏开发圈里的人一定听过优化游戏要降低DrawCall,这样到底什么是DrawCall呢?Unity中应该如何降低DrawCall,这里就来讲解一下关于DrawCall知识点。1.是谁拖了后腿?通俗的来说就是Cpu:(#`O′)喂你好,是Gpu吗?快点醒醒我这里又有画画的任务了(Cpu调用Gpu的次数),打一个比方比如上传很多文件到百度云或其他地方时,都会把它压缩到一个文件夹里…

大家好,又见面了,我是你们的朋友全栈君。

前言

游戏开发圈里的人一定听过优化游戏要降低DrawCall,这样到底什么是DrawCall呢?Unity中应该如何降低DrawCall,这里就来讲解一下关于DrawCall知识点。

1.是谁拖了后腿?

通俗的来说就是Cpu:(#`O′)喂你好,是Gpu吗?快点醒醒我这里又有画画的任务了(Cpu调用Gpu的次数),打一个比方比如上传很多文件到百度云或其他地方时,都会把它压缩到一个文件夹里,不会把它们分开上传(当然还有原因就是它们数据是相关,比如是主题的一套ico文件或软件的安装文件),排除这些和文件整合的原因,假设网速没有波动,分开传和压缩包,压缩包速度一定快很多的(不仅仅是因为压缩包更小),主要是每次上传还有一些预备动作(比如与服务器链接,初始化Socket等等),细心的会发现文件当拖动到百度云会有几毫秒的延迟。其实优化DrawCall主要是Cpu的处理速度的优化,Cpu和Gpu是并行工作的,处理的方式有一个命令缓存区,具体如图所示:

exp1

别看图中画的好像是Cpu在等待Gpu,实际上Cpu才是拖后腿的那个,现实中Gpu早就把命令缓存区里命令都处理完毕了,Cpu确还在准备DrawCall的命令,Cpu通过图像编程接口向命令缓存区添加命令,而Gpu通过缓存区获取命令处理。

2.为什么会拖后腿?

在每次调用DrawCall之前,因为Cpu需要向Gpu发送很多内容,包括数据、状态和命令,在这个阶段Cpu需要完成很多工作,比如检查渲染状态等(有一堆工作要Cpu处理,才会存放到缓存区),存放到缓存区以后,Gpu就要开始工作了,Gpu渲染能力还是很强的,渲染200或2000个三角网格通常看不出区别,导致Gpu渲染速度大于Cpu的提交速度,影响渲染流水线速度就是提交比较慢的Cpu(现在知道玩游戏要买的电脑配置了吧,一般选择Cpu比较好的,Gpu一般的即可,当然游戏画面特别好的,还是建议把显卡买好点的,有些游戏硬性条件普通显卡根本渲染不了,并不是渲染速度的问题了),最后可想而知Cpu会花费大量的时间在提交DrawCall的路上,造成Cpu的过载,Gpu确会出现空闲。

look1

3.优化DrawCall

降低DrawCall的方式还是很多的,先讨论如何降低2d游戏的DrawCall,2d游戏的资源都是图片,单个图片调用一次DrawCall会导致Cpu太难了,这样有没有办法降低提交次数呢?可以通过打包图集的操作来降低DrawCall,比如界面所用到的图片打包成图集或者人物的序列图打包到图集,具体如图所示:

exp2

可能会思考把所有界面的资源打包到一个图集里,岂不是美哉?这个时候Gpu会说太难了,只是渲染某个界面却要拿出整个图集去操作,热更新也会说我太难了,只是更新某个界面里的按钮图片样式却要替换整个图集,所以合理打包图集。
其实对图集这个东西理解还是比较深刻,写过和看过图集打包软件的源代码(当然和Unity的图集不是一个,但是大同小异),一般情况就是把图片数据全部写到一个文件里,然后保存ID或其他信息可以把单个图片找出来的方式,通过图集实现了提交大量的DrawCall。接下来思考模型如何降低DrawCall的调用。 Unity中可以通过静态批处理实现优化DrawCall,静态批处理的原理就是合并网格,而合并过程是需要消耗时间,因此批处理技术更加适合那些静态的物体,比如不会动的地面、树和石头,对于这些静态物体我们合并一次即可,当然可以使用动态批处理,但是,由于这些物体不断移动的,因此每帧都需要进行合并发送给Gpu,对时间和空间都有一定的影响。具体如图所示:

exp3

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125371.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • windows配置多个NTP服务器地址

    windows配置多个NTP服务器地址背景:有客户的windows配置了time.nist.gov作为时间同步服务器地址,可能因为这个服务器在美国,有时候不能成功从服务器拿到最新时间。所以给客户配置多个NTP地址,一个不行自动去问另一个。 1.打开cmd窗口(需以管理员身份运行)2.重启时间同步服务netstopw32time&netstartw32time3.配置NTP地址池(可以是域…

  • /etc/sudoers文件解析

    /etc/sudoers文件解析CATALOG前言规则讲解第一部分A第二部分B第三部分C第四部分D第五部分E举例前言/etc/sudoers文件一般涉及到linux系统中关于sudo命令的权限配置问题。规则讲解sudoers文件的数据,每一行分为五个部分,我们用ABCDE来表示。一般情况下是:AB={©}{D}E且C与D是可以省略的,我们用大括号扩起来方便大家注意到,但真正书写命令的时候不需要打括号。第一个部分A代表授权使用sudo的用户或者组第二部分B代表允许授权用户在哪些主机上使用这些权利第三部分C代

  • c# combobox属性dropdownlist赋值

    c# combobox属性dropdownlist赋值combobox属性设置为dropdownlist后,text赋值如果combobox的内容里有则显示,没有则不显示。 即如果combobox1包含ABCD,赋值A则可以显示,F则不行。

    2022年10月10日
  • 程序心形曲线绘制_java输出心形图案

    程序心形曲线绘制_java输出心形图案代码如下:importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Image;importjava.awt.Toolkit;importjavax.swing.JFrame;@SuppressWarnings(“serial”)publicclassDemoextendsJFrameimplementsRunna…

    2022年10月16日
  • java snmp walk,snmpwalk命令常用方法总结(转)[通俗易懂]

    java snmp walk,snmpwalk命令常用方法总结(转)[通俗易懂]snmpwalk命令则是测试系统各种信息最有效的方法,常用的方法如下:1、snmpwalk-cpublic-v1-mALL10.0.1.52.1.3.6.1.2.1.25.1得到取得windows端的系统进程用户数等2、snmpwalk-cpublic-v1-mALL10.0.1.52.1.3.6.1.2.1.25.2.2取得系统总内存3、snmpwal…

  • Vue路由懒加载_vuerouter路由懒加载

    Vue路由懒加载_vuerouter路由懒加载使用Vue路由懒加载时报了以下错误:经过百度发现,出现该问题的原因是:import属于异步引用组件,需要特殊的babel-loader处理解决办法:安装babel用来编译import异步引用方法的模块babel-plugin-syntax-dynamic-importcnpminstallbabel-plugin-syntax-dynamic-import-D在.b…

发表回复

您的电子邮箱地址不会被公开。

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