UWA学堂|逻辑代码模块
- 作者:admin
- /
- 时间:2022年04月22日
- /
- 浏览:1775 次
- /
- 分类:厚积薄发
本文主要为大家推荐UWA学堂中逻辑代码的相关课程,涵盖了C#、Lua、Garbage Collection以及DOTS等四个子类。
在UWA学堂界面中的“分类“选择逻辑代码即可查看相关课程。
无论对于从业者还是正在读大学的技术萌新,学习的有效时间和个人时间都是有限的。高效学习者最在意的是时间的价值,一个需要体系化的知识地图就显得尤为重要。
零基础
C#
市面上有很多书籍和专栏是介绍C#基础或者进阶特性的,无一例外,都是从头到尾罗列一遍C#特性,然后针对一个个特性去进行讲解和介绍,这种阅读体验相对会比较枯燥。阅读一些大部头的书籍又要占去了大量的业余时间,而有些读者仅仅是想知道其中的某一个语法特性或者仅仅是想达到一个能够开发项目的程度,在读者当时所处的阶段也许并不需要完全地了解C#的每一个语法细节和原理。基于以上的种种原因,本课程诞生了。
通读本课程,读者不仅能够过一遍常用的C#语法特性,还可以目睹一个知识体系构建的过程,最终还可以得到一个基本的C#知识体系。有了一个基本的知识体系之后,未来C#发布新的特性时,我们能减少一些恐慌的情绪,知道这个新的特性也许只是一个小的改进,也许是一个革新的特性,可以非常容易地把这个特性归纳到我们现有知识体系中,这就是知识体系的一个小作用。在笔者介绍C#的语法特性的过程中,笔者会花费更多的篇幅去介绍不怎么常用但是很重要的C#特性,一些大家比较了解且常用的,尤其是在网上随便一搜就能找到的语法特性笔者则会简单带过。
如果想要有一个基础的C#知识体系或者好奇一个知识体系是怎样产生的,又不想花费太多时间去看大部头的同学,非常推荐购买本课程。但是并不是说,学习完本课程后就可以不用看大部头了,大部头还是要看的,不过可以留到时间非常充裕的时候再去看,而且学习完本专栏之后再去看大部头会节省更多的时间。
初阶
Lua
文章主要介绍了Lua类型系统typesys是如何接入Unity的,以及接入后的使用范例。分别从“灵魂拷问”、“庖丁解牛”、“学以致用”、“抛砖引玉”这四个角度来详细阐述。读者朋友们能够在文章中与作者进行深度的思想交流,还能在最后拿到范例工程的源码。由于源码是基于typesys来编写的,所以学习过课程《用Lua打造类型系统:typesys》的读者可以即开即用。为了让读者朋友们能够形象且直观地感受typesys在Unity里的应用,作者将用其做第三人称3D游戏的基础3C(角色、相机和控制),能够直接在Unity运行看到效果。
本课程属于基础课程,适合所有读者。
进阶
Lua
目前,随着大家项目对于热更新的需求越来越高,Lua脚本与Unreal引擎的结合逐步成为了大型项目开发的热门选择。但是,随着Lua脚本在项目中的重度使用,其和引擎结合后的性能问题就不断地凸显出来。因此,我们针对Unreal引擎开发中看到的Lua性能问题进行分析和总结,并通过示例讲解如何对Lua代码使用过程中的性能问题进行快速地定位和优化。
这些问题主要包括:CPU耗时性能瓶颈、堆内存分配的性能瓶颈和GC调用频繁等。希望通过本课程,可以让开发者掌握如何在Unreal引擎中更高效地使用Lua脚本,从而带来性能更佳的游戏体验。
文章主要介绍了用Lua实现的类型系统:typesys,围绕“为什么需要typesys”,“typesys有哪些功能”,“typesys能防御哪些错误”,“typesys的配置、优化和扩展”等几部分来进行阐述。读者朋友们能够在其中看到一些作者的亲身经历以及踩过的坑。
为了让读者朋友们能更直观地去体验typesys,作者在附上typesys源码的同时,还提供了typesys能防御的各类错误的示例代码,每一个示例都可以单独运行;甚至还用typesys做了一个小小的文字游戏,非常有趣,并奉上了全部源码。
本课程属于非基础课程,适合有一定技术管理经验的读者。
文章主要介绍了用Lua实现的串行脚本框架:LT-scriptsys。分别从“灵魂拷问”、“庖丁解牛”、“学以致用”、“抛砖引玉”这四个角度来详细阐述。读者朋友们能够在文章中与作者进行深度的思想交流,还能在最后拿到框架的完整源码。由于源码是基于typesys来编写的,所以学习过上一篇文章《用Lua打造类型系统:typesys》的读者可以即开即用。为了让读者朋友们能够形象且直观地感受本框架的应用,作者将上一篇文章中创作的小游戏《寻宝吧,冒险者》使用本框架重写了,并增强了乐趣体验,代码自然也是全部奉上。
本课程属于非基础课程,适合有框架编写经验的读者。
《一名普通程序员的犯错日常- Lua-typesys的设计与演化》
在重度使用Lua进行开发的游戏项目上,如何有效地进行代码管理?如何帮助编程经验并不那么丰富的年轻团队尽量规避编码错误?作者创作了一个轻量的、纯Lua的类型系统,试图通过这样的途径来打造具备一定编码防御性、可监管性和可扩展性的基础框架,使游戏项目开发变得更容易一些。此次分享将围绕“为什么需要typesys”,“typesys有哪些功能”,“typesys的防御和监管能力”,“typesys的配置、优化和扩展”这几个大块来进行阐述。每一块都会与大家交流作者的设计意图以及过程中面对矛盾时是如何进行抉择的。除了纯理论思考的部分,作者还会分享一些应用实践:在Unity项目中接入typesys;已经将typesys应用到自己项目中的朋友们的反馈等。
Garbage Collection
文章主要介绍了UE4垃圾回收系统的实现原理。UE4在C++上封装了对象系统,并添加了反射,从而实现基于C++的垃圾回收。开发者使用UObject时不用手动管理内存,兼顾了效率与便利。
UE4使用“标记清扫”GC算法,文章首先介绍了“标记清扫”的基本原理。UE4的GC算法可分为标记和清扫两个阶段。
1)标记阶段
标记阶段是GC算法的重头。UE4会从“根集”出发,根据引用关系,搜索内存中所有可达UObject。为了加快搜索速度,一方面使用多线程技术并行搜索,另一方面通过反射生成ReferenceTokenStream,提升遍历一个UObject引用关系的效率。
2)清扫阶段
标记阶段收集了所有可达UObject,其余不可达UObject被视为垃圾,它们会被UE删除并释放内存。由于垃圾之后不可能再变得可达,因此UE可以分帧清理它们,避免卡顿。
文章属于中级课程,适合对UE4开发感兴趣的读者。
本篇文章分为十个部分来讲解堆内存的内存优化。我们从原理入手,以递进的关系讲解了逻辑开发中会遇到的各种堆内存分配(GC Alloc)相关的“坑”。本文将依次重点讲解以下几个部分的堆内存优化技巧:从对象和结构体的内存结构,到对象池,再到不安全代码,也包含利用 .NET 4.x 和 UnsafeUtility 进行优化的技巧,最后提供了Protobuf优化和字符串操作优化等具体案例。非常适用于参与逻辑开发或对堆内存GC优化感兴趣的同学们。
DOTS
DOTS全称是Data-Oriented Tech Stack,翻译过来就是多线程式数据导向型技术堆栈(DOTS),它由任务系统(Job System)、实体组件系统(ECS)、Burst Compiler编译器三部分组成。DOTS保证相同类型组件在内存中都是顺序排列,极大程度增加缓存的命中率,此外配合任务系统(Job System)让开发者无需头疼多线程同时访问数据需要手动加解锁的麻烦,最终加持Burst Compiler让性能飞起来。文本以最新的Unity 2019.3版本,学习DOTS的原理、ECS系统原理、Burst Compiler原理和JobSystem原理,带你掌握DOTS让游戏性能提升2000倍的秘密。
在《DOTS深度研究之原理分析篇》中,我们详细介绍了DOTS的工作原理,让大家可以深入理解任务系统(Job System)、实体组件系统(ECS)、Burst Compiler编译器的工作方式。虽然DOTS可以大量提升游戏性能,但是如何才能快速且有效地应用在具体项目中呢?有的项目刚立项,也有的项目已经开发了一半,美术是否抵制DOTS的开发流程?诸如此类的问题接踵而至。
Unity引擎为了让传统游戏对象方式转成DOTS的流程已经做了很多努力,但是仍有提升空间。比如,目前摆在实际项目中的两大头号难题,烘焙贴图的应用和DOTS动画系统的应用,这两个问题官方都没有提供直接解决方案,但是可以在本文中找到间接实现的方法。
本篇文章还提供了大量的例子,全面地介绍了如何快速应用DOTS,并且还提供了工程源码方便大家学习与调试。
在最新的Unity引擎中,DOTS功能可以使开发者更方便地应用面向数据编程模式以及利用引擎的并行特性。在本次报告中,我们将通过大量测试案例与性能数据,探索DOTS对于游戏不同模块的性能影响,以使大家能够根据项目需要,合理地全局或局部对游戏模块进行DOTS化。
高阶
Lua
为何要在Lua和C#之间高效共享数据?读这篇文章之前,我想先解释一下,后面的内容能够为你解决什么:
众所周知,Lua与C#跨语言交互很容易成为性能瓶颈,大量被浪费的CPU时间仅仅为了做一件事——从Lua传递信息到C#。为了减少交互次数,我们不得不仔细设计,尽可能减少Lua和C#的耦合,但一些对数据依赖性很高的逻辑,比如战斗逻辑中的AI逻辑或者技能逻辑就很难同时用两个语言开发,我们不得不在全lua(性能差)或者全C#(无法热更)中二选一,难以根据需求混合使用双语言以同时兼顾性能和热更。
因此,我们提供了一种高性能方法,在Lua和C#之间,直接共享读写大量数据,避开跨语言交互,从根本上移除跨语言传递数据的性能消耗。
数据高度共享意味着你有巨大的自由混合使用Lua和C#,因为两个语言都可以高速读写同一套数据。从此不用为数据放在哪里、跨语言访问数据会不会成为性能瓶颈而烦恼。
数据高度共享意味着你的热更新覆盖率更高,更容易做到新功能发布不需要更新本体包,哪怕是修改性能比较敏感的例如战斗逻辑这样的内容。另外在需要hot fix bug的时候,因为数据是高度共享的,绕过C#直接解决问题的可能性就被大大提高。
数据高度共享意味着,不管为了性能还是为了提高热更覆盖率,在Lua和C#之间迁移代码都会变得更简单,因为数据两边都可以访问,你很容易就可以将局部的一块代码转移,不会因为数据依赖而大片地重写代码(特别采用类似ECS这种数据分离的方案时)。
新方案可以让Lua和C#各自以接近语言原生的性能效率读写共享的数据,相比通过Lua调用C#进行传递的方式,可以提升5~10倍的效率,跨语言共享数据将不再是性能瓶颈。
本议题将重点讲解如何通过Lua来开发一套适合UE游戏项目的开发解决方案。其中不仅介绍UE如何嵌入Lua,而且详细讲解Lua与引擎接口、Lua与蓝图之间如何交互。同时,将更进一步讲解如何使游戏开发全面Lua化,以及如何合理地使用Lua开发以Delicated Server为服务器的各种游戏。希望通过本次分享,可以对目前使用UE引擎进行游戏开发的研发团队有所帮助。
以上就是我们本期为大家梳理的逻辑代码学习路径图。需要说明的是,这个路径图并不是捷径,相反13篇文章会更加训练大家的意志力。作为体系化的知识,我们希望大家能掌握背后的逻辑与原理,结合学习方法论并反复实践,未来尝试在自己的项目中创新创造出自己满意的效果
往期回顾
《Unity引擎渲染模块知识Tree汇总》
《Unity引擎UI模块知识Tree》
《UWA学堂|开发流程模块》
《UWA学堂|解决方案模块》
《UWA学堂|优化模块》