原文  http://www.cnblogs.com/ybgame/p/3588795.html

在最近,使用U3D开发的游戏核心部分功能即将完成,中间由于各种历史原因,导致项目存在比较大的问题,这些问题在最后,恐怕只能通过一次彻底的重构来解决

现在的游戏跑起来会有接近130-170个左右的DrawCall,游戏运行起来明显感觉到卡,而经过一天的优化,DrawCall成功缩减到 30-70个,这个效果是非常显著的,并且这个优化并没有通过将现有的资源打包图集来实现,图集都是原有的图集,如果从全局的角度对图集再进行一次优化, 那么DrawCall还可以再减少十几个

本次优化的重点包括:层级关系和特效

对于U3D,我是一个菜鸟,对于U3D的一些东西是一知半解,例如DrawCall,我得到的是一些并不完全正确的信息,例如将N个纹理打包成 一个图集,这个图集就只会产生一个DrawCall,如果不打成图集,那么就会有N个DrawCall,这个观点在很多人的认识里都是正确的,因为可以通 过简单的操作来验证,但严格来说,这个观点是错误的,因为它还受层级关系影响!

【一】渲染顺序

U3D的渲染是有顺序的,U3D的渲染顺序是由我们控制的,控制好U3D的渲染顺序,你才能控制好DrawCall

一个DrawCall,表示U3D使用这个材质/纹理,来进行一次渲染,那么这次渲染假设有3个对象,那么当3个对象都使用这一个材质/纹理的 时候,就会产生一次DrawCall,可以理解为一次将纹理输送到屏幕上的过程,(实际上引擎大多会使用如双缓冲,缓存这类的手段来优化这个过程,但在这 里我们只需要这样子认识就可以了),假设3个对象使用不同的材质/纹理,那么无疑会产生3个DrawCall

接下来我们的3个对象使用2个材质,A和B使用材质1,C使用材质2,这时候来看,应该是有2个DrawCall,或者3个DrawCall。 应该是2个DrawCall啊,为什么会有3个DrawCall???而且是有时候2个,有时候3个。我们按照上面的DrawCall分析流程来分析一 下:

1.渲染A,使用材质1
2.渲染B,使用材质1
3.渲染C,使用材质2

在这种情况下是2个DrawCall,在下面这种情况下,则是3个DrawCall

1.渲染A,使用材质1
2.渲染C,使用材质2
3.渲染B,使用材质1

因为我们没有控制好渲染顺序(或者说没有去特意控制),所以导致了额外的DrawCall,因为A和B不是一次性渲染完的,而是被C打断了,所以导致材质1被分为两次渲染

那么是什么在控制这个渲染顺序呢?首先在多个相机的情况下,U3D会根据相机的深度顺序进行渲染,在每个相机中,它会根据你距离相机的距离,由远到近进行渲染,在UI相机中,还会根据你UI对象的深度进行渲染

那么我们要做的就是,对要渲染的对象进行一次规划,正确地排列好它们,规则是,按照Z轴或者深度,对空间进行划分,然后确定好每个对象的Z轴和深度,让使用同一个材质的东西,尽量保持在这个空间内,不要让其他材质的对象进入这个空间,否则就会打断这个空间的渲染顺序

在这个基础上,更细的规则有:

场景中的东西,我们使用Z轴来进行空间的划分,例如背景层,特效层1,人物层,特效层2
NGUI中的东西,我们统一使用Depth来进行空间的划分
人物模型,当人物模型只是用一个材质,DrawCall只有1,但是用了2个以上的材质,DrawCall就会暴增(或许对材质的RenderQueue 进行规划也可以使DrawCall只有2个,但这个要拆分好才行),3D人物处于复杂3D场景中的时候,我们的空间规则难免被破坏,这只能在设计的时候尽 量去避免这种情况了
使用了多个材质的特效,在动画的过程中,往往会引起DrawCall的波动,在视觉效果可以接受的范围内,可以将特效也进行空间划分,假设这个特效是2D显示,那么可以使用Z轴来划分空间

【二】打包图集

每个材质/纹理的渲染一定是会产生DrawCall的,这个DrawCall只能通过打包图集来进行优化

制作图集一般遵循几个规则:
从功能角度进行划分,例如UI可以划分为公共部分,以及每个具体的界面,功能上,显示上密切相关的图片打包到一起
不要一股脑把所有东西打包到一个图集里,特别是那些不可能同时出现的东西,它们就不应该在一个图集里,这样的图集意义不大,减少不了DrawCall,并且一个你不需要显示的图片,会一直占用你的内存,这让我非常不爽
注意控制图集的大小,不要让图集太大,一个超级大图集的DrawCall消耗或许顶的上十几个小图集的消耗

字符图集,在使用BMFont或者其他工具生成图片字的时候,我们往往是直接导入一大串文字,然后直接生成图片,但实际上这上面的操作也有优化 空间,例如BMFont生成的图片大小,是可以设置的,有两个规则,一个规则是导出的图片尽量小,另一个是导出的图片尽量少,默认的大小应该是 512x512,假设你生成的图片256x256就可以容纳,那么多做一个操作你可以节省这么多空间,另外当你输入多几个字,就导致增加一张图片时,例如 1024变成2048,那么你可以考虑使用3张512的图片,这样也会节省空间

经过精心划分的图集在加上精心规划的渲染顺序,DrawCall会有一个质的优化

【三】特效清理

U3D提供了非常便捷的方法让我们很轻易地使用美术给过来的特效,懒惰的U3D程序猿会直接放入U3D,甚至不去看这是个什么特效,我们的特效 一般都是一瞬间的事情,例如技能特效,或者其他什么特效,那么特效播放完,这个特效我们就看不到了,但假设这个特效在播放结束的时候,没有将自身的 Active属性设置为false,那么它就会继续占用你的DrawCall,消耗你设备的计算能力,所以程序需要保证当一个特效播放完之后,能够被消 耗,或者设置为非激活的状态,可以使用一些公共方法来完成特效播放完之后的清理工作(自己实现2个静态函数,一个播放完销毁,一个播放完设置未激活)

完成DrawCall的优化之后,接下来就是内存的优化了,(内存优化手记 待续)

转载于:https://www.cnblogs.com/zhanlang96/p/3946777.html

【转】 U3D DrawCall优化手记 - 夜阑卧听风吹雨相关推荐

  1. U3D DrawCall优化手记 - 夜阑卧听风吹雨

     原文  http://www.cnblogs.com/ybgame/p/3588795.html 在最近,使用U3D开发的游戏核心部分功能即将完成,中间由于各种历史原因,导致项目存在比较大的问题,这 ...

  2. Unity AssetBundle爬坑手记 - 夜阑卧听风吹雨

    http://www.tuicool.com/articles/ieYJBf 这篇文章从AssetBundle的打包,使用,管理以及内存占用各个方面进行了比较全面的分析,对AssetBundle使用过 ...

  3. Unity DrawCall优化

    Unity DrawCall优化 一 Mesh Renderer  二 Skinned Mesh Renderer  三 合并要求对比  四 总结  五 场景制作建议 DrawCall优化合并,也叫批 ...

  4. creator DrawCall 优化

    DrawCall 优化 概念说明 在游戏开发中,DrawCall 作为一个非常重要的性能指标,直接影响游戏的整体性能表现. 无论是 Cocos Creator.Unity.Unreal 还是其他游戏引 ...

  5. 那一夜,我听了一宿梵唱

    那一夜,我听了一宿梵唱.不为参悟,只为寻你的一丝气息.那一月,我转过所有经轮.不为超度,只为触摸你的指纹.那一年,我磕长头拥抱尘埃.不为朝佛,只为贴着了你的温暖.那一世,我翻遍十万大山.不为修来世,只 ...

  6. u3d android 优化

    最近项目进入收尾阶段,之前对项目做了很多优化,mesh合并 ,减少DrawCall和模型骨骼以及物理计算,合并材质球,优化代码等等,在IOS上还好,但是Android上,试过几款手机,从低端到高端,发 ...

  7. proxmox VE备份优化手记--两次优化,大幅度提高性能

    问题描述 某项目由两套proxmox组成,一套运行所有的应用程序,一台运行mysql数据库.为了保险起见,proxmox外挂共享存储,夜间对所有的虚拟机进行自动备份. 备份是用的一台4U服务器,考虑到 ...

  8. java 0b,java 1.6.0_38-b05 vm 20.13-b02优化手记

    基础: 业务代码 rose框架(底层是spring) resin4 java 1.6.0_38-b05 centos 初始配置: 只修改了以下三个值 -Xmx5000M // max的heap的大小. ...

  9. 数据库单表千万行 LIKE 搜索优化手记

    我们经常在数据库中使用 LIKE 操作符来完成对数据的模糊搜索,LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. 如果需要查找客户表中所有姓氏是"张"的数据,可以使用 ...

最新文章

  1. 伤感网络验证系统_可验证云数据库架构与设计
  2. 局域网交换(交换机三大原理.基本配置)
  3. Linux CenOS7下安装RabbitMQ
  4. Java I/O模型从BIO到NIO和Reactor模式
  5. Python 3 开发钉钉群机器人
  6. 【C#每日一贴】ArrayList 转换成byte数组
  7. 大牛书单 | 人工智能方向好书分享(第二期)
  8. 【转载】Python操作Excel的读取以及写入
  9. php中括号的优先级是不是最高的,理解php中操作符的优先级和结合性
  10. ​CSDN疯狂盲盒来啦!iPhone 12、机械键盘、Switch等你来拿!
  11. Calendar与Date用法示例
  12. 红色警戒2地图编辑器研究
  13. 探寻Linux 中国之路
  14. 网页制作html山鸡,做一个简单的html网页
  15. office2019 retail零售版转换vol批量授权版 cmd批处理命令 kms示例
  16. db2 replace函数的用法_总结篇--SUBSTITU函数实用终极帖
  17. [附源码]计算机毕业设计JAVA网上书店管理系统
  18. macOS:给 app 添加摄像头权限
  19. 在ubuntu 18上进行NPB和mpiP的整合
  20. Python学习:python time模块之time.mktime()

热门文章

  1. ES5、ES6自学笔记
  2. 计算1+12+123+1234+12345
  3. 大学python作业_python(易知大学作业) - 随笔分类 - DGX杂学 - 博客园
  4. idea利用正则表达式快速替换
  5. 阻塞IO与非阻塞IO(NIO)
  6. 扒一扒磁条导航和Slam导航的AGV交管思路
  7. c语言产生随机数不变怎么办,用C语言产生随机数。怎么办?
  8. 为什么“业财融合”下,不懂业务的财务将被无情淘汰?
  9. 数据结构课程设计——项目1:中国计算机设计大赛赛事统计
  10. 炫酷手持滚动弹幕生成小工具微信小程序源码多样化模板