Unity引擎逻辑代码模块知识Tree
- 作者:admin
- /
- 时间:2020年11月18日
- /
- 浏览:4968 次
- /
- 分类:厚积薄发
无论对于从业者还是正在读大学的技术萌新,学习的有效时间和个人时间都是有限的。高效学习者最在意的是时间的价值,一个需要体系化的知识地图就显得尤为重要。
《Unity引擎逻辑代码模块知识Tree》是我们整理推出的第5个知识Tree,我们也推出过《Unity引擎渲染模块知识Tree》、《Unity引擎UI模块知识Tree》、《Unity引擎资源管理模块知识Tree》和《UWA学堂|课程综合模块知识Tree》,欢迎大家按照自己的兴趣和需要参考取阅。
一、寻路
这篇文章向读者提供了一个完整详细的解决方案。主要内容包括RecastNavigation的基本原理,Unity NavMesh导航数据导出的详细算法流程。同时附带的项目工程包含了完整的导出算法的实现、数据存储以及导出数据在RecastNavigation系统中的加载。
整个工程包含两部分:
工程一是基于RecastNavigation系统的导出算法和实现工程,构建后将输出DLL和Bundle文件,作为Unity编辑器中的Native Plugin,来实现导出导航数据的功能,支持Win32/Win64/OSX64(OSX32需要自己使用旧版本XCode设置和编译),同时还包括一个修改版本的RecastNavigation Demo,可以加载从Unity导出的NavMesh来显示;
工程二是一个Unity导出NavMesh的示例工程,使用了前者编译的插件来导出当前场景烘焙的NavMesh导航数据。
本课程将要探讨的是多单位同时寻路的方式。首先,列举了A-star、Dijkstra和Floyd三种常用的寻路算法,并对A-star算法进行了详细介绍,然后分析了几种常用算法的优缺点,最后介绍了流场的生成以及流场效率优化的方向,同时提供了RTS千人寻路算法的实现方案,并附上了Demo帮助大家理解学习。
课程属于初级课程,旨在让大家了解目前常用的寻路方法和原理,在应用到实际项目中,依然需要根据自身项目情况进行修改和完善。
二、DOTS
DOTS全称是Data-Oriented Tech Stack,翻译过来就是多线程式数据导向型技术堆栈。它由任务系统(Job System)、实体组件系统(ECS)和Burst Compiler编译器三部分组成。DOTS保证相同类型组件在内存中都是顺序排列,极大程度地增加了缓存的命中率,此外配合任务系统(Job System)让开发者无需头疼多线程同时访问数据需要手动加解锁的麻烦,最终加持Burst Compiler让性能飞起来。
文本以Unity 2019.3版本,学习DOTS的原理、ECS系统原理、Burst Compiler原理和JobSystem原理,带你掌握DOTS让游戏性能提升2000倍的秘密。
虽然DOTS可以大量提升游戏性能,但是如何才能快速且有效地应用在具体项目中呢?有的项目刚立项,也有的项目已经开发了一半,美术是否抵制DOTS的开发流程?诸如此类的问题接踵而至。
Unity引擎为了让传统游戏对象方式转成DOTS的流程已经做了很多努力,但是仍有提升空间。比如,目前摆在实际项目中的两大头号难题,烘焙贴图的应用和DOTS动画系统的应用,这两个问题官方都没有提供直接解决方案,但是可以在本文中找到间接实现的方法。文章提供了大量的例子,全面地介绍了如何快速应用DOTS,并提供了工程源码方便大家学习与调试。
在最新的Unity引擎中,DOTS功能可以使开发者更方便地应用面向数据编程模式以及利用引擎的并行特性。课程通过大量测试案例与性能数据,探索DOTS对于游戏不同模块的性能影响,以使大家能够根据项目需要,合理地全局或局部对游戏模块进行DOTS化。
《移动游戏开发核心技术讲解:3D UI、GPU Skinning和DOTS》
在本次课程中,我们通过具体实例详细讲解了移动游戏中的一些核心功能开发技术:3D UI界面的基本制作方法、如何通过GPU Skinning技术来实现群体动画系统、如何将DOTS技术与战斗系统相结合,在具体实例中实现高性能的战斗效果。
通过该课程,我们希望大家可以真正理解其底层工作原理,同时通过工程源码来掌握其中的具体实现和优化技巧,从而了解游戏行业中的真实技术需求和解决这些问题的方式和方法。
三、Lua
众所周知,Lua与C#跨语言交互很容易成为性能瓶颈,大量被浪费的CPU时间仅仅为了做一件事——从Lua传递信息到C#。为了减少交互次数,我们不得不仔细设计,尽可能减少Lua和C#的耦合,但一些对数据依赖性很高的逻辑,比如战斗逻辑中的AI逻辑或者技能逻辑就很难同时用两个语言开发,我们不得不在全Lua(性能差)或者全C#(无法热更)中二选一,难以根据需求混合使用双语言以同时兼顾性能和热更。
因此,我们提供了一种高性能方法,在Lua和C#之间,直接共享读写大量数据,避开跨语言交互,从根本上移除跨语言传递数据的性能消耗。数据高度共享意味着你有巨大的自由混合使用Lua和C#,因为两个语言都可以高速读写同一套数据。从此不用为数据放在哪里、跨语言访问数据会不会成为性能瓶颈而烦恼。数据高度共享意味着你的热更新覆盖率更高,更容易做到新功能发布不需要更新本体包,哪怕是修改性能比较敏感的例如战斗逻辑这样的内容。
另外在需要Hotfix bug的时候,因为数据是高度共享的,绕过C#直接解决问题的可能性就被大大提高。数据高度共享意味着,不管为了性能还是为了提高热更覆盖率,在Lua和C#之间迁移代码都会变得更简单,因为数据两边都可以访问,你很容易就可以将局部的一块代码转移,不会因为数据依赖而大片地重写代码(特别采用类似ECS这种数据分离的方案时)。新方案可以让Lua和C#各自以接近语言原生的性能效率读写共享的数据,相比通过Lua调用C#进行传递的方式,可以提升5~10倍的效率,跨语言共享数据将不再是性能瓶颈。
文章主要介绍了用Lua实现的类型系统:typesys,围绕“为什么需要typesys”,“typesys有哪些功能”,“typesys能防御哪些错误”,“typesys的配置、优化和扩展”等几部分来进行阐述。读者朋友们能够在其中看到一些作者的亲身经历以及踩过的坑。
为了让读者朋友们能更直观地去体验typesys,作者在附上typesys源码的同时,还提供了typesys能防御的各类错误的示例代码,每一个示例都可以单独运行;甚至还用typesys做了一个小小的文字游戏,非常有趣,并奉上了全部源码。
《基于“typesys”实现串行脚本框架》
《“typesys”接入Unity初体验》
这两节课程的源码需结合课程《用Lua打造类型系统:typesys》中lua-typesys的源码一起运行,分别从“灵魂拷问”、“庖丁解牛”、“学以致用”、“抛砖引玉”这四个角度来详细阐述,带读者用Lua实现的串行脚本框架以及介绍了Lua类型系统typesys是如何接入Unity的。
《用好Lua+Unity,让性能飞起来——Lua与C#交互篇》
整合Lua是目前最强大的Unity热更新方案,毕竟这是唯一可以支持iOS热更新的办法。然而作为一个重度uLua用户,我们踩过了很多坑才将uLua上升到一个可以在项目中大规模使用的状态。事实上即使到现在,Lua+Unity的方案仍不能肆意地被使用。要用好,你需要知道很多。本文就介绍了Lua+Unity方案的性能优化技巧。
《用好Lua+Unity,让性能飞起来—LuaJIT性能坑详解》
大家都知道LuaJIT比原生Lua快,快在JIT这三个字上。但实际情况是,LuaJIT的行为十分复杂。尤其JIT并不是一个简单地把代码翻译成机器码的机制,背后有很多会影响性能的因素存在,本文作者将带大家一一说明。
《Lua配置表存储优化方案》
近几年手游大热,Unity+Lua更是手游行业的标配技术。如何有效利用有限的硬件条件,实现当下高品质、高规格的游戏产品是持久不变的话题。本文将介绍一种消除配置文件中冗余数据,达到压缩和优化数据存储的方法。
《Lua性能优化—Lua内存优化》
本文是作者结合自身在Lua性能方面优化的一些经验,主要是和大家分享拿到原始数据后,如何处理过滤数据、信息的经验,从而更快更准确地定位问题。文中用到的技术并不难懂,相信大家能够快速掌握。
Lua中可回收的对象递归关系
《Lua的CPU开销性能优化》
这是一篇着重介绍如何写好Lua代码,并做好优化工作的技术文章。文中作者并没有介绍那些通俗的优化方法,而是首先总结了自己在优化过程中常见的性能问题,并通过实际优化案例的分析,来为大家提供更为实在的参考。
四、换装
Avatar换装是MMO游戏不可缺少的一部分,一个人物模型通常可拆分为头、身体、手臂、腿和武器等部分,如何将这些部分组合到一起呢?本文将阐述如何将在Unity中实现人物模型的换装功能。
《Unity游戏的换装系统优化》
本文主要介绍了游戏内换装系统的优化。尤其对于多人同屏,30人以上高并发的频繁换装需求,本文对帧率优化和内存优化均提供了详细方案和Demo代码下载,适合对Unity和引擎渲染有一定基础的读者。
五、网络
《Unity项目技术研发之模块设计:网络上传下载》
《Unity项目技术研发之模块设计:异步任务》
在信息爆炸的今天,互联网上有着不计其数的各类模块的实现参考或者学习资料,但能够教会我们“如何设计出足够好的模块”或者“这些好用的模块实现是怎么设计出来的”的相关资料却相对贫乏。作者把设计模块的整个过程写成一系列的文章,传递给更多需要的同学,以应那句古话:“授之于鱼,不如授之以渔”。
这一系列的文章往往都是整个复杂的思考过程的浓缩,也有许多设计方法论蕴含其中,我试图将文章和文章之间用某种思考方式串联起来,以求达到一加一大于二的效果。作者尝试用一种简单直白的方式把这些抽象晦涩的信息表达出来,希望能够引起大家对设计过程的思考。
文章从简单的HTTP协议讲起,介绍如何用Socket直接封装一个下载组件,如何实现断点续传,如何实现边玩边下载,又如何优化下载,加快下载速度,同时控制下载过程中总的内存开销。最后讲解了项目中的热更新机制是怎么做的。
通过该文章的学习,你可以快速掌握解决以上项目痛点的方法,同时还提供Demo源码,方便大家快速应用到自己的项目中。
课程内容涉及到计算机网络体系结构基础知识,包括网络分层、TCP首部与IP首部结构组成,从零开始实现了一个异步多线程网络通信库插件。课程通过简易网络程序引入对底层原理的讲解,再结合实际问题,分析应对策略,最后落实到代码实现。完整讲解了出现问题的原因以及解决问题的方法,结构清晰,层层递进,一目了然。核心内容如下:
- 深入分析了TCP三次握手流程及其作用
- 详细讲解了TCP协议保证可靠传输的原理
- 梳理了网络数据在各层之间封装传输的完整流程
- 解决了TCP协议面向数据流特性所导致的粘包分包问题
- 开发了异步多线程可扩展、易使用的网络通信库插件
- 实现了从控制台服务器到Unity客户端的完整聊天案例
六、热更新
如果您正在头疼该怎么去做热更新,或者觉得当前自己的热更新方案不好用,本文可以提供一些思路。从实际项目上线后要解决的问题出发,与您分享每个决策点为什么这么做,要解决什么问题,为什么不选择备选方案。主要包含以下内容:
- 版本号管理,让每一个版本号都有具体的存在意义
- 母包、热更新包的打包方式
- 热更新包检测、下载以及使用细节
- 如何做版本兼容,发了一个商店大版本,线上用户不更新商店也可以进游戏
- 如何让热更新包尽量无冗余,尽量小
- 简述另外一种热更新方案
《Unity项目热更新技术的性能分析总结》
针对主流热更新技术(基于C#和Lua)进行性能对比,以期让开发者找到最适合项目自身的应用方案和实现技巧。内容主要包括:
- 主流热更新技术简介
- 各方案原理、性能对比、适用场景
- Lua性能瓶颈分析及其优化技巧
《Android平台的代码热更新》
代码热更新在项目开发中起着举足轻重的作用:开发期间能减少版本迭代次数、提升程序调试效率、大大缩短开发周期;运营期间降低大版本更新频率、减少用户流失、提高留存付费等。因此,代码热更新已经成为项目开发中几乎必不可少的环节。
Unity引擎组件化设计及跨平台发布的特性为游戏开发带来了极大的便利,但天然不支持代码热更新是国内开发者都头痛的问题。本文为大家介绍的方法主要解决Unity游戏在Android平台的C#代码热更新问题。
七、动画
文章主要介绍了PlayableGraph中AnimationClipPlayable的使用方法,分为四个部分。
第一节介绍了PlayableGraph是什么,以及通过Animator使用的血泪史来分析了为什么需要使用AnimationClipPlayable,并且介绍了相应的解决方案;第二节则通过案例详细介绍了PlayableGraph相关API的使用以及注意事项,避免踩到性能方面的坑;第三节主要是在PC和手机上面进行了详细的性能测试和分析,避免正常使用的时候踩坑;第四节则是一些配套辅助工具的使用,如何查看正在运行的PlayableGraph的节点状态以及如何在手机上统计一段时间内某个函数的平均耗时开销。
文章属于初级内容,适合了解过Animator并且想要解决Animator状态机过于复杂、加载效率低下等问题的读者。学完本文,能够掌握解决Animator上述问题的解决方案(Unity 2019版本之前)以及PlayableGraph的正确使用方式(Unity 2019及之后版本),并且对AnimationClipPlayable的使用细节和技巧有一定的认知。
作者在开放场景项目中需要实现大规模的蝴蝶动画来提升场景的活力,增加场景细节和丰富程度。本课程从思考问题开始,分析各种实现方式的利弊,参考《神秘海域4》的技术分享,最终实现了一套方案。完整地还原了思考问题以及解决问题的过程。
课程提供了Demo所有的核心代码,并经过Unity 2019.4LTS、iPhone 6s测试通过。作为抛砖引玉,课程实现的效果并不只局限于此,可以举一反三将其应用到其它类似的需求上,增加场景的丰富程度和活力。
《Unity 移动游戏中动画系统的性能优化》
基于对Unity移动游戏的动画系统性能瓶颈进行有针对性的分析,并通过大量案例在不同移动设备上实际运行的性能分析,将动画系统性能瓶颈进行归纳和总结,进而提出优化建议和解决方案。主要包括:
- 动画系统的性能瓶颈现状
- 动画系统中需要关注的重要性能参数
- 针对各性能瓶颈的优化建议和解决方案
- 对动画系统在多角色场景中的应用提出多种解决方案
《动画重定向技术分析及其在Unity中的应用》
动画重定向技术是一种时间换空间的思路,在运行时将一套动画根据预计算好的骨骼差异信息,得到目标模型骨架上可以适用的动画数据,就可以生成目标角色的受击动画效果。这种方式既可以减少美术的工作量,又可以增加游戏对策划需求和修改的灵活度。
《Unity动画文件优化探究》
为了优化Unity动画文件,作者从压缩浮点数精度和去除scale曲线两个角度出发,通过多次实验观察,得出了通过精度优化降低内存的本质,文末附工具代码和使用说明,值得大家探究和借鉴。
八、综合
《C# 知识体系构建》
通读本课程,读者不仅能够过一遍常用的C#语法特性,还可以目睹一个知识体系构建的过程,最终还可以得到一个基本的C#知识体系。有了一个基本的知识体系之后,未来C#发布新的特性时,我们能减少一些恐慌的情绪,知道这个新的特性也许只是一个小的改进,也许是一个革新的特性,可以非常容易地把这个特性归纳到我们现有知识体系中,这就是知识体系的一个小作用。在作者介绍C#的语法特性的过程中,作者会花费更多的篇幅去介绍不怎么常用但是很重要的C#特性,一些大家比较了解且常用的,尤其是在网上随便一搜就能找到的语法特性作者则会简单带过。
如果想要有一个基础的C#知识体系或者好奇一个知识体系是怎样产生的,又不想花费太多时间去看大部头的同学,非常推荐购买本课程。但是并不是说,学习完本课程后就可以不用看大部头了,大部头还是要看的,不过可以留到时间非常充裕的时候再去看,而且学习完本专栏之后再去看大部头会节省更多的时间。
《逻辑代码的性能瓶颈定位与优化方法》
针对Unity引擎中的逻辑代码(C#脚本)自身及其在与Lua交互的过程中常见的性能问题进行针对性的分析,并通过示例介绍如何通过UWA GOT等工具对相关问题进行快速地定位和优化,内容主要包括:
- 堆内存峰值过高
- 堆内存泄漏
- GC调用频繁
- CPU耗时瓶颈定位等
《Unity引擎渲染、UI、逻辑代码模块的量化分析和优化方法》
Unity引擎的渲染、UI和逻辑脚本耗时是大多数项目的Top 3耗时模块。对此,我们对这三个模块进行量化地统计和分析,介绍准确定位性能瓶颈的方法。同时,从常见的性能问题入手,分析和对比各种可行的性能优化方案,以求显著地提升这些模块的效率。内容包括:
- 渲染模块的重要参数分析以及优化方法
- UI模块瓶颈的精确定位和优化
- C#/Lua瓶颈函数的优化方法
《第二银河》作为紫龙游戏 Blackjack Studio自研的一款太空科幻类沙盒游戏,开发周期长,游戏内容多,技术难度高。为了满足全球同服、千人团战、浩瀚宇宙空间探索等基本游戏特色的需求,开发团队经历了一次次技术迭代,攻克了一个个技术难关,以向玩家提供最好的游戏体验为目标。本次报告将从客户端和服务器两个角度出发,分享《第二银河》的开发经验,主要内容包括:
- 大型战斗中同屏大量渲染内容的处理,包括海量的飞船、炮弹和特效等,着重在Drawcall和Overdraw两个方面的处理方式。
- 大型战斗中CPU端巨量的飞船运动模拟的优化,以应对不同运动方式模拟所对应的大量的数学计算。
- 大量玩家带来的巨量协议的处理压力,特别是大范围技能使用的时候,客户端短时间内大量协议数据的处理方式的分享。
- 其他方面的优化,包括序列化、Unity动画状态机、美术资源内存占用、Mono堆内存和UI模块的优化等。
UWA为大量项目进行深度优化服务时会提供全面深入的性能分析和有针对性的解决方案。本次报告将总结UWA今年来深度优化过程中所遇到的各类实战性能问题。通过具体的案例,分析各类性能问题的相关机制原理,介绍如何借助UWA分析工具快速、精准地定位性能瓶颈,以及可操作、行之有效的解决方案。本课程是《Unity移动游戏项目优化案例分析》的第二场,主要内容包含的是逻辑代码(包括Lua)以及其他引擎模块的性能问题总结、分析和解决方案。
视频的第8小节动画部分提到的 Animator.keepAnimatorCOntrollerStateOnDisable 选项在部分Unity版本中存在BUG(不起效),因此使用时仍需要注意。
《第三人称视角游戏的镜头全自动控制方案》
文章主要介绍了第三人称视角的游戏,在镜头控制上会有哪些问题,我们是如何用全自动控制的方式来解决这些问题的,以及全自动控制的镜头将会带给用户什么样的游戏体验。本课程从问题出发,对比了常用解决方案的优缺点,详细介绍了全自动控制镜头的处理思路,以及对策略优先级的思考。
以上是就是本期为大家梳理的Unity引擎逻辑代码模块知识Tree,作为体系化的知识,我们希望大家能掌握背后的逻辑与原理,结合学习方法论并反复实践,能够在自己的项目中更高效地进行资源管理。同时也欢迎大家向我们投稿,交流行业内的技术知识。