资源管理

Q:Unity 5 的 Shader Variant Collection 功能是否推荐使用?我有以下3个疑点:
1)使用 Shader 变体之后,Shader 是否还能走资源更新?抑或 Shader 不推荐走资源更新?
2)Shader 变体和 Shader Always Include 的主要区别是什么?二者对内存和帧率影响如何?
3)在 Unity 5 较早的版本中,Shader 变体功能似乎有一些Bug,现在是否可靠?

经过测试,在较新的版本中(如Unity 5.5.3),将ShaderVariantCollection与Shader打包在相同的AssetBundle中后,其中会包含该Shader在ShaderVariantCollection中指定的Variant。因此:

1)使用 ShaderVariantCollection后依然可以进行资源更新(通过更新AssetBundle,来更新Shader的实现或者ShaderVariantCollection中包含的Variant)。

2)ShaderVariantCollection与Always Included Shaders的区别主要在于打包时所包含的Variant。Always Included Shaders中的Shader,其所有的Variant都会被包含,好处是,理论上不会出现Variant丢失的情况;坏处是,会导致更大的发布包以及额外的内存占用,而影响最大的是手动进行Warmup时的耗时以及ShaderLab的内存占用。因此一般来说,对于Variant特别多的Shader(如Standard Shader),并不推荐放入Always Included Shaders中。

3)目前即使是较新的版本,其可靠性我们也并不能确保,依然建议在使用前进行一些测试来验证。

此问答来自于UWA 问答社区:
https://answer.uwa4d.com/question/591418087640b5a822204e73
如您对该问题仍有疑问,可以转至社区进行进一步交流。


性能优化

Q2:请问为什么我项目渲染中Material.SetPassFast的开销这么高?这个该如何优化?

Material.SetPassFast是Unity引擎在渲染过程中Material的轮循切换开销,一般在Unity5.0~Unity5.3版本中出现。它的开销主要分为两种:

1) Shader.CreateGPUProgram峰值开销
这种情况主要出现在Shader第一次渲染时。在Unity5.0以后,引擎为了避免Shader加载时过高的CPU峰值出现,已经将Shader.Parse和Shader.CreateGPUProgram两种操作分开执行,前者在Shader加载时,后者在Shader第一次渲染时。下图则为一款项目运行时渲染时的Shader.CreateGPUProgram开销。

2) 渲染状态切换开销
这种情况是几乎每一帧都发生的,有渲染的地方就会有Material的切换。从问题图中可以看出,在运行的16000帧中,Material.SetPassFast一共被调用137万次。这里可以认为几乎全部是渲染时Material的切换操作。因此,该项较高的主要原因还是材质切换操作过多所致。所以,建议研发团队在报告中的详细材质页面查看是否有过多“冗余”的材质出现,如有则尽可能降低材质的使用冗余度。


动画

Q3:Animator会把所有状态的AnimationClip加载到内存,有什么好的办法可以动态加载?

1)Animator Controller结构不需要改变,但动画需要变化。比如随着人物等级或技能升级,同种的攻击动作随着变化等。该种需求可以通过AnimatorOverrideController来进行完成,即按需加载新的AnimationClip,然后替换AnimatorOverrideController中相应的AnimationClip即可。目前,Unity的AnimatorOverriderController不仅可以进行单个替换,同时也可以ApplyOverrides成组替换;

2)Animator Controller结构需要改变,类似于Animation老版本动画的AddClip功能。这种需求需要替换AnimatorController,研发团队可以在动态加载AnimationClip的同时,动态加载相应的Animator Controller,然后进行替换即可。

以上方法研发团队可根据自身实际情况而定。


动画

Q4:为什么Transform.设置Parent会触发Animator的初始化吗?Parent是等于null的。

把 Parent 设为null,相当于把这个 GameObject 变为根节点。如果在设置之前这个 GameObject 本身是激活状态,但其的父节点是未激活状态,那么设置之后,相当于把这个GameObject 激活。而激活GameObject 时就会触发 Animator.Initialize 等操作了。


资源管理

Q5:美术做粒子的时候,粒子与粒子之间共用资源的情况很多,例如某几个粒子共用一个Material,某几个粒子共用一个贴图等,应该如何组织AssetBundle?要是对应到最细的那个程度,凡是共用过的资源都单独打一个AssetBundle,好像又会很琐碎,假如不那么做,粒子与粒子之间的AssetBundle又会有冗余。这方面有什么好的建议?

AssetBundle打包没有标准的方式,单就粒子系统而言,因为其个体本身比较小,并且在项目中经常大量出现,所以并不建议将粒子系统逐个打包,而是建议根据其出现频率进行打包,比如将同一段时间、同一出现场景等的粒子系统打包在一起。同时,由于粒子系统的Shader基本上都是Unity内置Shader,因此,尽可能将Shader进行依赖打包。我们在UWA Day 2017上对于这种情况进行了详细说明,其Shader在中低端移动设备上的加载开销较高,需要研发团队特别关注。

原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

技术分享连载(六十四)相关推荐

  1. DockOne微信分享(六十四):基于Docker实现DevOps的一些探索

    本文讲的是DockOne微信分享(六十四):基于Docker实现DevOps的一些探索[编者的话]本次分享从DevOps介绍:Docker介绍:基于Docker实现DevOps的优势:Docker化D ...

  2. 技术分享连载(十八)

    图形渲染 Q1:我看到Unity 5.3.5版本中恢复了对粒子系统的合批功能,但是我尝试下来并没有达到这个效果.是粒子系统合批有什么要求吗,实例化会不会对粒子系统的合批造成影响呢? 经过我们验证,Un ...

  3. 【正点原子Linux连载】第六十四章 Linux 多点电容触摸屏实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  4. UWA 技术分享连载 转载

    技术分享连载1 Q1:Texture占用内存总是双倍,这个是我们自己的问题,还是Unity引擎的机制? Q2:我现在发现两个因素直接影响Overhead,一个是Shader的复杂度,一个是空Updat ...

  5. [Python从零到壹] 六十四.图像识别及经典案例篇之图像傅里叶变换和傅里叶逆变换详解

    祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所 ...

  6. DockOne微信分享(六十九):微服务选型之Modern Node.js

    本文讲的是DockOne微信分享(六十九):微服务选型之Modern Node.js[编者的话]目前Node.js的发展非常快,大家可能还停留在:Node.js性能很好,Node.js里都是回调,写起 ...

  7. DockOne微信分享(八十四):Docker在B站的实施之路

    本文讲的是DockOne微信分享(八十四):Docker在B站的实施之路[编者的话]B站一直在关注Docker的发展,去年成功在核心SLB(Tengine)集群上实施了Docker.今年我们对比了各种 ...

  8. 信息系统项目管理师核心考点(六十四)信息安全基础知识重要概念

    科科过为您带来软考信息系统项目管理师核心重点考点(六十四)信息安全基础知识重要概念,内含思维导图+真题 [信息系统项目管理师核心考点]信息安全基础知识重要概念 1.加密技术 ①对称加密[加密与解密的秘 ...

  9. 陈艾盐:《春燕》百集访谈节目第六十四集

    <春燕>访谈节目共120集,每月分10集播出,记录了上百位企业家对"慈善"的各种不同见解,通过讲述社会真善美的故事,让更多的人了解慈善.发扬慈善精神,构建更加美好,和谐 ...

  10. QT开发(六十四)——QT样式表(二)

    QT开发(六十四)--QT样式表 本文主要翻译自QT官方文档Qt Style Sheets . 五.QT样式表参考 QT样式表支持多种的属性.状态和子控件,使得定制组件的外观成为可能. 1.组件 以下 ...

最新文章

  1. Opencv4测试报错00007FFB3253A9C0 (ntdll.dll)处引发的异常: 0xC0000005: 读取位置 0x0000000000000010 时发生访问冲突
  2. 【python教程入门学习】Pandas库下载和安装
  3. Silverlight学习笔记之页面跳转
  4. Intellij IDEA + Maven——jar项目改成war项目相互转换
  5. linux mysql 实战_linux实用实战
  6. PowerDesigner导出Report通用报表
  7. ARM Cortex-M0(1)---浅谈ARM Cortex-M0
  8. 三星Galaxy S21 FE即将量产:8月登场 小屏满血旗舰!
  9. mongodb 导出数据
  10. 彪悍语录系列(摘于网络)
  11. IP地址与子网掩码划分的心得
  12. 评估分形指数和HURST指数预测金融时间序列的能力
  13. 易基因 | 表观技术:单细胞及微量细胞全基因组重亚硫酸盐甲基化测序(scWGBS)
  14. metasequoia :Summoner
  15. 《满族姓氏寻根大全·满族老姓全录》
  16. 哈工大操作系统学习笔记十——信号量与死锁
  17. OAuth client 微信、qq、新浪登录
  18. tkinter 出现两个窗口 tk(未响应) 解决方法
  19. 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch
  20. 【云原生系列】第三讲:Knative 之 Serving

热门文章

  1. java函数ao活动对象_Java程序设计10-11试卷A0105答案
  2. 电脑教程从入门到精通_如何自学原画设计|新手如何开始学原画?(附视频教程从入门到精通)...
  3. 利用GBDT模型构造新特征具体方法
  4. vue-cli搭建的项目打包之后报“资源路径错误资源文件找不到“
  5. 伪分布式hbase数据迁移汇总
  6. 【learning】洲阁筛
  7. 20165221 实验五 网络编程与安全
  8. 洛谷P1868 饥饿的奶牛
  9. OpenCV中cvWaitKey()函数注意事项
  10. linux安装unzip及使用