http://forum.china.unity3d.com/thread-25087-1-9.html

Unite Europe 2017的Keynote主题演讲中,我们为大家分享了将主机游戏《影子战术》现场移植到移动平台的过程,并分享了游戏针对移动平台进行的优化。今天这篇文章将为大家分享该游戏制作过程中总结的开发经验。

这其中的很多问题只有当你真正在制作主机游戏、手机游戏、或者处理巨量游戏内容时才会出现。如果在开发的早期就能把这些问题考虑进去,那么在开发过程中,你会更轻松,而你的游戏也会更炫酷。

Transform变化消息每当一个GameObject移动、旋转、缩放时,我们必须通知让每个与它相关的游戏系统。渲染、物理、以及该GameObject的每个父子物体,都需要被通知到,以匹配它做出的动作。随着游戏内容的增加,GameObject的数量也会暴涨,仅是发送这些消息的开销就会成为很大的性能问题。

以Unite Europe 2017上分享的项目 《影子战术》为例。

这是一个NPC以及它的所有组成部件。这张截图是他们使用Optimize Game Objects(优化游戏对象)选项,优化了骨骼绑定之后截取的。所以原始版本的NPC,除了所有的游戏对象和模型结构之外,还有NPC模型的所有骨骼。

 

这是一个很标准的游戏设计过程:关卡设计师设置NPC的生成对象。然后在运行时,这些生成对象会实例化一个NPC作为其子物体。Enemy_normal是NPC的根节点,它包含了用来控制NPC移动的NavAgent组件。每个NPC都有一堆的子物体来实现NPC的各个功能。这些看起来没有任何问题。

但这意味着,在每一帧,当NPC移动的时候,它必须通知这个NPC的所有子物体,告诉它们根节点的transform已经发生了变化。每一帧,每一个NPC都会发送成百上千的transform变化消息,占用大量的帧处理时间。

我们在发现Transform变化消息消耗大量帧时间的问题后,与Mimimi Productions进行了讨论,他们将NPC的生成方式做了简化处理。除了使用Optimize Game Objects之外,他们开始在场景的根节点下生成NPC,并把NPC能力相关的游戏对象都移到NPC的根节点上,使它们不会成为NavAgent组件的子对象。这样Nav Agent下面只剩下NPC的视觉与物理组件。优化过后,在他们的目标硬件平台上的帧率提高了10帧左右。

重要的事,多说几遍:

每秒钟提升了10帧!10帧!帧!

没有影响工作流程。无需返工重做大量的工作。仅仅是在他们现有的内容上做了一点改动。

 

Transform变化分发

从Unity 5.4开始,我们一直在尽最大努力优化所有与transform和Transform变化消息相关的代码。我们已经优化了内存布局并提供了.SetPositionAndRotation API来避免没有特定关联的改变。我们现在允许向系统注册某个特定的transform,而不是向引擎中的每个系统都广播Transform变化消息。

正在进行中的一个巨大改变是,我们将逐步迁移到一个延迟多线程TransformChangeDispatch系统。这让我们可以将所有的Transform 变化消息形成独立的队列,并在主线程之外对它们进行解析。我们正对尽可能多的系统进行迁移,分发这些通知,而不是让它们在主线程上进行同步处理。

即使有了这些改进,在开发游戏时你仍要好好考虑你的层级结构。这样能帮你节约帧执行时间,为你的玩家提供更好的游戏体验。

层级结构指南

如果有东西每一帧都会移动,确保它所有的子物体都确实需要了解位置信息。只有渲染、物理、音频或者类似的核心系统才应该出现。

在运行时动态创建的游戏对象,如果它们没有必要作为出生点对象的子物体,那就放在场景的根节点下。

你可以很方便的注册自己生成的所有内容,并通过OnEnable 和OnDisable来向它们传递出生点对象的ActiveInHeirarchy状态。

尝试将需要移动的物体进行分组,大约每个根节点50个左右的GameObject。这样,底层系统可以将你的TransformChangeDispatch任务按照每线程最优数量进行分组。可避免出现线程过于繁忙或过于空闲的情况。

结语

感谢Mimimi Productions让我们使用《影子战术》作为范例。我们还将为大家分享游戏开发相关的全局光照和多场景编辑的经验与教训,请保持关注!

Unite Europe案例项目《影子战术》层级优化经验分享的更多相关文章

  1. Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理

    Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理 2017年01月04日 08:52:12 阅读数:18366 基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB ...

  2. Unity MMORPG游戏优化经验分享

    https://mp.weixin.qq.com/s/thGF2WVUkIQYQDrz5DISxA 今天由Unity技术支持工程师高岩,根据实际的技术支持工作经验积累,分享如何对Unity MMORP ...

  3. 项目优化经验分享(八)TeamLeader经验总结

    引言 通过前面的七篇博客.我把自己在项目优化过程的经验进行了分享,今天这篇博客,作为一个总结,就来讲讲作为一个TeamLeader,在项目管理中遇到的问题和解决经验! 正文 问题一:团队之间怎么沟通? ...

  4. 项目优化经验分享(六)SVN冲突和处理

    上一篇博客我们分享了新增需求的确定思想<站在全局看问题>.今天我们来分享项目开发中SVN冲突的解决经验:SVN冲突和处理! 引言 开发过项目的人都知道,公司开发一个项目都会使用到版本号控制 ...

  5. C#.NET 大型企业信息化系统 - 防黑客攻击 - SSO系统加固优化经验分享

    好久没写文章了,突然间也不知道写什么好了一样,好多人可能以为我死了,写个文章分享一下.证明一下自己还在,很好的活着吧,刷个存在感. 放弃了很多娱乐.休闲.旅游.写文章.看书.陪伴家人,静心默默的用了接 ...

  6. Unity技术支持团队性能优化经验分享

    https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247490321&idx=1&sn=f9f34407ee5c5d ...

  7. Web前端性能优化经验分享

    最近一直有给新同学做前端方面的培训,也有去参与公司前端的招聘,所以把自己资料库里面很多高效且有用的知识做了些 规整分类,然后再分享一篇关于前端优化方面的总结.而且春节一过就又是招聘的高峰期了,在校的. ...

  8. Go程序GC优化经验分享

    http://1234n.com/?post/yzsrwa 最近一段时间对<仙侠道>的服务端进行了一系列针对GC的调优,这里跟各位分享一下调优的经验. 游戏第一次上线的时候,大部分精力都投 ...

  9. 使用Jquery+EasyUI 进行框架项目开发案例讲解之四 组织机构管理源码分享

    http://www.cnblogs.com/huyong/p/3404647.html 在上三篇文章  <使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享> ...

随机推荐

  1. python manage.py shell 的增删改查

    python manage.py shell 的增删改查 guoguo-MacBook-Pro:myblog guoguo$ python manage.py shell Python 3.5.1 ( ...

  2. Feature Selection 其一 —— Filter Approach

    这一个部分都将只涉及到选择特征的某个子集的方法,将高纬度的特征空间映射到低维度空间的方法(如PCA)都不会涉及到. 一. 单变量 优点:运算速度快,独立于分类器 缺点:忽略的特征之间的联系,忽略了与分 ...

  3. spring 'arroudAspect' for bean class [com.dw.test.ArroudAspect] conflicts with existing, non-compatible bean definition of same name and class [com.dw.aspect.ArroudAspect]

    Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: ...

  4. 【转】BigInteger、BigDecimal详解

    参考 http://lavasoft.blog.51cto.com/62575/228705/ 从Java4到Java5,Java对BigInteger.BigDecimal两个类功能一直再做扩展与改 ...

  5. JDBC超时原理与设置

    抄录自网上,因为担心以后找不到,因此抄录之.感谢分享的大神! 英文原版:http://www.cubrid.org/blog/dev-platform/understanding-jdbc-inter ...

  6. 安装NXNET

    cran <- getOption("repos") cran["dmlc"] <- "https://s3-us-west-2.amaz ...

  7. 让loadrunner走下神坛(全)

    作者: sunshinelius(转载请注明作者) Loadrunner无疑是一个强大有力的压力测试工具.它的脚本可以录制生成,自动关联:测试场景可以面向指标,多方监控:测试结果图表显示,拆分组合.相 ...

  8. 世界各国Google网址大全

    http://www.oschina.net/question/100896_50293 冰岛 https://www.google.is/ 丹麦 https://www.google.dk/ 挪威  ...

  9. HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)

    描述 给一个整数N,请你求出以N为分母的最简(既约)真分数中第K小的是多少? 输入 两个整数N个K. 对于30%的数据,1 <= N <= 1000000 对于100%的数据,1 < ...

  10. Spring笔记05(Spring JDBC三种数据源和ORM框架的映射)

    1.ORM框架的映射 01.JDBC连接数据库以前的方式代码,并给对象赋值 @Test /** * 以前的方式jdbc */ public void TestJdbc(){ /** * 连接数据库的四 ...