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. 深入理解Java虚拟机到底是什么(转)

    原文链接:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机   作为一个Java程序员,我们每天都在写Java ...

  2. Java for LeetCode 111 Minimum Depth of Binary Tree

    Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...

  3. MVC+Ext.net零基础学习记录(二)

    很多人在开发一个新的项目时,需要先决定项目的整体架构,是决定使用MVC的同时也不例外,具体包含:项目的多语言性,项目的多风格选择,项目的可扩展性 其中项目的多语言性:http://www.cnblog ...

  4. CDH版本Hbase二级索引方案Solr key value index

    概述 在Hbase中,表的RowKey 按照字典排序, Region按照RowKey设置split point进行shard,通过这种方式实现的全局.分布式索引. 成为了其成功的最大的砝码. 然而单一 ...

  5. Adding Form Fields to a MS Word Document

    Configuring a Word Merge in SmartSimple is a three-step process: Create the MS Word document that wi ...

  6. PHP之面向对象PHP之面向对象(面向对象是什么)

    PHP之面向对象(面向对象是什么) 一.总结 一句话总结: 面向对象就是类:类都要 属性 和 方法 比如人:属性比如身高体重,方法比如吃饭喝水 面向对象中 ,方法即是函数 : 属性即是变量 ,只是面相 ...

  7. html5--1.16 内联框架

    html5--1.16 内联框架 学习要点: 1.iframe内联框架2.综合实例1 1.iframe内联框架 1.iframe元素用来在文档中添加一个内联框架. 2.iframe为body元素的子元 ...

  8. MySQL_杭州11月1-29号在线产品在线天数、销售天数_20161129

    杭州11月1-29号在线产品在线天数.销售天数 1.产品在这个时间段内的每一天的在线情况,然后聚合计算每个产品的在线天数,每一天的在线情况 如果在线记为1,不在线为null 2.计算每个产品在这个时间 ...

  9. bzoj 4516: 生成魔咒 后缀数组

    题目大意 在结尾动态插入字符,每次插入结束后输出当前串中本质不同的字串个数 题解 注意一开始是空串,然后我们我们可以打表观察规律 我们发现一直在开头插入字符和一直在结尾插入字符得到的答案是一样的 所以 ...

  10. AtCoder Regular Contest 073 E:Ball Coloring

    题目传送门:https://arc073.contest.atcoder.jp/tasks/arc073_c 题目翻译 给你\(N\)个袋子,每个袋子里有俩白球,白球上写了数字.对于每一个袋子,你需要 ...