DomDomm 发表于 2022-5-5 12:45

主程/架构师进阶 大师攻略

前言


[*]今天要给大家分享的是《大型实时竞技网游开发之:深入架构与优化》
[*]为什么会有这个主题呢?因为大家平时在学习游戏开发的课程时或者碰到大型网络游戏项目时,就会发现有这么几个问题:

[*]1、不知道如何制作一个大型的游戏项目:

[*]对于开发过大型游戏项目的同学,他的问题可能是做到后期以后,进行项目测试时发现性能不行,不知道该如何优化
[*]对于没有做过大型游戏项目的同学,就是面对大型网络游戏项目时该从何下手,完全没有思路

[*]2、如果这个游戏不是回合制、放置、养成类等节奏比较慢的游戏,而是需要进行“实时竞技”的游戏,可能会进一步加深你的疑惑,比如实时竞技游戏的实时性如何表现?
[*]3、而且,当你的游戏项目碰到了“实时”这两个字时,原来那种类似于回合制,或者慢吞吞的游戏里碰不到的问题就会显现出来

[*]你会发现游戏开发并没有那么简单,所以我们今天的课程就是帮助大家解决这个问题,我会给大家分享在开发大型实时竞技网游时该如何做,做了以后如何优化,这就是我们的今天课程的目标!
版权声明


[*]本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
[*]更多学习资源请加QQ:1517069595或WX:alice17173获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
[*]点赞、关注、分享可免费获得配套学习资源
[*]点击观看完整视频
机构介绍




[*]优梦创客:我们的目标是帮助各位同学创作一款大家爱玩的游戏
[*]我是今天课程的主讲老师雷蒙德,在行业内有14年的从业经验,做过程序员、技术经理、教学经理,目前的是我们优梦创客的创始人
[*]下面是我曾经参与制作过的一些成功的项目作品,包括有:《传奇世界》,《神迹I/II》,《疯狂赛车》,《Infinity3D引擎》,《剑网三》等
主题




[*]今天的课程主题大致会分成这几点

[*]1、我们会给大家讲一讲游戏开发可以分成几个阶段?
[*]2、在什么阶段要做游戏的架构,在什么阶段要针对游戏去做优化
[*]3、帧同步游戏的架构有哪些地方需要优化?

[*]大家注意:这些内容如果你只是仅仅接触过一些基础的游戏开发,那么你可能根本碰不到这样的问题
[*]很多同学在面试时都会碰到一个问题,就是连面试官想问的问题都听不懂,为什么?

[*]因为有的同学完全没有接触到那种规模层次的程序,所以就不能理解面试官所问的一些问题

[*]这部分就是给大家介绍在大规模游戏项目中会碰到什么样的问题,这部分的内容主要是

[*]你会碰到什么问题
[*]当你碰到这个问题的时候该如何解决


[*]4,代码热更新的优化要点

[*]大家知道现在Unity主推的是ILRunTime代码热更新方案,其实不管是早期的Lua,还是一些比较偏门的热更新方案,都没有进入到Unity官方的视野里,最终Unity选择了使用ILRunTime来进行热更新
[*]那么这种热更新方案为什么会成为Unity主推的热更新方案呢?它的优点在哪里?这种方案的性能怎么样?咱们参加VIP课程的同学也经常问我:“如果我在我的项目里使用了ILRunTime,那么对ILRunTime的项目做优化时的要点在哪里呢?”,这就是我们要帮助大家解决的问题

[*]5,资源热更新的优化要点

[*]现在的资源热更新有两种方案,一种是Unity早期的AssetBundle,如果你使用AssetBundle的解决方案,那么你就需要自己写一个资源管理的插件,要自己做资源的底层管理
[*]所以Unity也推出了一个Addressable,这里我们不去区分所谓的AssetBundle,也就是AB;还是现在unity主推的Addressable,也就是所谓的AA,我们会讲一讲资源热更新优化的通用规则


游戏开发的阶段




[*]第一阶段

[*]确定需求

[*]在游戏开发之前,我们需要确定一下游戏开发的需求,什么叫确定需求?说白了就是我们要做什么样的游戏,这件事情我们可以通过GameJam来确定游戏开发的原型,它的核心功能是大概什么样子
[*]这个阶段我们不会要求游戏的画面特别的精致,但要能体现游戏的玩法创意

[*]预研阶段

[*]当我确定了要做一个项目时,我就要想一想:我这个项目是要同时支撑多少人在线,比如万人同服;或者一个服务器能开多少个房间来同时进行游戏,这个时候我就要预研,什么叫预研,说白了就是确定项目到底是能做还是不能做

[*]立项阶段

[*]什么叫立项呢?说白了就是找人找钱,先找钱再找人,如果你自己有资金,你也可以自己投资


[*]第二阶段

[*]当我们确定了要开发一个项目以后,我们该找什么样的人呢?是先找一些新手程序员来做游戏的功能模块呢?还是先找一些主程架构师来帮我们搭游戏的架构呢?很显然,我们是要找有经验的人
[*]底层库

[*]在第二个阶段里,我们要先把游戏的底层库搭起来,比如游戏的网络通讯库、游戏的网络协议库,当然很多的网络通讯和网络协议的库都是已经提前做好的,你可以直接把它引进来,或者同学们有十年或十年以上工作经验以后,有了自己的游戏框架,你就可以直接把你的框架带到你的新公司、新项目里去
[*]底层库还包括数据访问、数据序列化、消息通讯、UI框架的一些库,这些库都需要搭建好

[*]高层架构开发

[*]底层库其实也包括了高层架构,比如我们开发游戏时肯定会用到MVC或者MVVM来做整体架构的解耦
[*]当我们把第二个阶段做完了以后,我们就相当于是把地基打好了,接下来我们就会进入到第三阶段


[*]第三阶段

[*]业务逻辑开发

[*]在第三阶段里,我们会开发游戏的业务逻辑,这一阶段可以找一些工作经验没有那么多的新人,比如找一些新手同学来拼UI,来实现各种简单的业务逻辑
[*]很多新手在公司里被叫做UI仔,什么叫UI仔?就是专门负责拼UI、写UI的功能,并且是在主程已经开发好UI框架的情况下,他只是把一个又一个功能填进去,比如要响应什么消息,响应消息时应该展示什么画面,或者当我接收到用户的点击或者拖拽时,应该发出什么样的请求,就干这些事儿
[*]这是特别初级的程序员,稍微中级一点的程序员会开发相对复杂一点、核心一点,或者难一点的程序,比如开发游戏的战斗系统、做游戏的中台、或者做游戏的性能优化、做画面渲染的渲染管线定制,还包括SDK的接入、还有服务器的服务器逻辑,数据库缓存层的一些开发等等,基本上客户端的用人需求会比服务器要大一些


[*]第四阶段

[*]测试

[*]当我们把游戏整体开发完以后,我们就会进入到游戏的测试阶段,测试阶段有两种情况:

[*]一种情况是你的项目完全没有问题,那么你就会直接进入到第五个阶段,就是所谓的里程碑达成
[*]第二种情况是当你的项目出现问题时,你就要回头进行架构或者是业务逻辑的调整,直到测试通过

[*]游戏的测试基本上是可以分成单元测试和联合的调试测试,单元测试又可以分成黑盒和白盒测试,并且也可以采用一些自动化的方法来进行测试
[*]在我们进入到压力测试的阶段时还会开发一些机器人来进行压力测试,比如在我们的《皇室战争》项目里,我们就使用了机器人来对我们的架构进行万人同服的压力测试,而且是单服万人同服,不是带有负载均衡的服务器,而是单个服务器能支持万人同时在线,并且我们的开房间也是做过相应的性能测试,能够承受商业项目的压力


[*]第五阶段

[*]里程碑达成

[*]里程碑达成以后,就会进入到下一轮迭代,在下一轮迭代里,我们会确定下一个需求,然后一步一步走下去
[*]有同学可能说:“里程碑达成了,那么下一轮迭代时,我的底层库和高层架构还需要重新开发吗?还需要再去迭代吗?”
[*]答案是需要,可能有同学认为当开发完游戏的项目架构时,对于架构师,或者对于游戏公司的主程来说,就没他什么事儿了,所有工作都结束了
[*]但其实完全不是,我们的架构也会经过一轮一轮的迭代,你的架构在性能、可扩展性、可维护性上是不是还有改进的空间,这是需要我们深思的一点
[*]第二点,就算你的架构在你认知的范围里,在架构师的认知的范围里已经足够的完美了,但你也不确定是不是会有新的需求出现,比如我们要开发一个国战,这对于服务器的性能要求就更高了,对于客户端中同屏处理的玩家或者是在跨地图时要做的处理也更多了
[*]这时的需求就发生了变化,架构师也需要重新调整程序架构,所以不是说咱们做完架构就什么事都没有了,当然你的业务逻辑也要继续开发,要继续测试


[*]注意点

[*]1,没有人能预见到所有的事情
[*]2,在软件开发里,唯一不变的是变换的需求

[*]以上两点的意思就是:

[*]需求总是在变的,没有一成不变
[*]在开发和设计时要考虑到架构有可能是不断变化的,所以我们的架构要能够适应这种变化的需求,这也就是为什么设计模式会出现的原因,设计模式的出现就是为了解决需求不断变化的问题


[*]3,架构不是空谈

[*]架构形成程序代码以后,它就是一组类、一组接口,他们会形成各个功能组件,每个功能组件完成不同的功能,所以架构绝对不是空谈,它是通过一轮一轮的迭代得到的
[*]包括我们的《皇室战争》项目也是一样,之后我会给大家看我们《皇室战争》项目的迭代过程

[*]4,不管是在学习中还是我们在开发项目的过程中,我们都需要遵循商业项目的规律来做

[*]即使我们在学习,也应该遵循上面第一阶段到第五阶段的顺序,这样你学到的东西才是真正在游戏企业里会真实用到的东西,你的开发方式才能真正的跟游戏公司的需求接轨


《皇室战争》商业帧同步项目的开发过程




[*]我们的《皇室战争》商业帧同步项目的开发流程是什么样的开发流程呢?上面我们说了:我们遵循了游戏企业的开发过程
[*]S1:项目原型开发

[*]刚才讲的商业项目的开发过程中的第一步是要有一个基本的游戏原型,所以在我们的S1项目中,我们最主要的目的就是开发项目的游戏原型
[*]各位同学如果是从小白开始起步学习游戏开发,那么大家就把第一季好好看一看,如果是有经验的同学就可以跳过第一季
[*]核心游戏系统

[*]那第一季里我们是怎么样去开发项目的呢?首先我们是从零开始一步一步的实现游戏项目的核心的系统,大家想一想,《皇室战争》是一个卡牌实时竞技的游戏,它的特点:

[*]1,离不开卡牌

[*]所以说我们要开发卡牌系统

[*]2,离不开卡牌的实时竞技

[*]也就是说它需要有战斗

[*]3,我们在战斗前后,加了游戏的开场和结束剧情,这是原版《皇室战争》没有的
[*]还有其他的系统,在这儿我就不再赘述,大家如果需要了解详情,可以在文末扫艾丽丝老师的二维码来了解


[*]消息系统

[*]我这里就是要告诉大家我们的第一个步骤做了什么,我们也做了基础的架构支持,比如一个商业游戏它一定会有一个消息系统,也就是我们MVC里的消息系统

[*]UI框架

[*]我们需要有一个UI框架,比如《皇室战争》里,它会有战斗中的卡牌UI、战斗之前或者战斗之后的主界面也有UI、包括一些任务UI、还有商城的UI、部落的UI、比赛UI,所以它需要有UI框架的支持

[*]Shader效果

[*]皇室战争里会涉及到很多的Shader效果,所以在我们在S1课程里也会讲到游戏的Shader效果实现,比如一个角色被国王塔挡住以后,那么角色不应该是看不见的,我们应该知道有多少的小兵在攻击国王塔,所以我们就应该以一个透视的方式来显示这个角色
[*]大家知道,Unity有两种渲染管线,一种叫做内置渲染管线,一种叫URP管线,我们的项目中更多的使用的是Unity主推的URP管线,大家如果对Unity的发展有了解的话,就会知道:Unity的URP渲染管线的性能和它的可拓展性都不是传统的内置管线可以比拟的
[*]以上就是我们的Shader效果实现部分,我们在制作项目时是完全遵循商业项目的流程的,我们课程不仅仅是带大家做一个效果,还会大家做性能优化,因为商业游戏里做的东西是给很多人去玩的,所以我要考虑性能,要对Shader做管线优化
[*]我们在TA课程的二次元卡通渲染专题里也会对《原神》里的角色做很多的二次元卡渲的优化

[*]资源管理

[*]我们的资源管理是用Addressable来做的,因为Addressable,也就是我们俗称的AA,它是进阶版的AB(AssetBundle),它把AssetBundle底层里的那些复杂性问题全部隐藏起来了,它就像一柄屠龙刀一样,你只要能把它用好,就能够取得快速开发游戏的效果
[*]而且Addressable还有官方支持,官方还在不断地对AA做功能更新,所以它可以帮助你更快、更加有效率的完成工作,我们在《皇室战争》S1里会用到AA的资源管理
[*]很多同学说:AA我用不熟、不太会用、不好用、甚至有同学说AA能不能跟Lua结合、能不能和ILRunTime结合、它好像只能是边下边玩,我想告诉大家的是:这是因为你学的太少
[*]AA的功能非常强大,它跟ILRunTime跟Lua结合是没有任何问题的,它做游戏启动前的下载更新也是没有任何问题的,其实我们已经完整地实现了AA的一整套流程

[*]代码热更新

[*]代码热更新可以使用ILRunTime,ILRunTime也是Unity现在主推的热更方案,我们课程会同时讲ILRunTime跟Lua热更新


[*]大型分布式服务器开发基础

[*]以上就是我们的《皇室战争》S1,在S1中我们会重点讲解游戏的项目原型开发,这和商业项目是一致的,S1里主要开发的是游戏的客户端部分,那么我是不是该把游戏的客户端跟服务器做一个结合呢?现在不是网络游戏的手机游戏可能很少了,而且单机游戏很难获得良好的收益
[*]所以第二部分我们就要开发大型的分布式服务器,有同学可能会问:“老师我在最早开发游戏时可能没有考虑到网络问题,那么我的项目架构该怎样支持网络游戏开发呢?
[*]这就是我要教大家的,我们在商业项目开发中,即使有一个功能现在暂时没有做,也要把它的接口留好,该留哪些接口是由我们的开发经验所决定的,在第一季里我们就已经把项目的基本接口全部留好了
[*]在《皇室战争》S2开始之前,我们会学习大型分布式游戏的开发基础,这部分你学完以后,你就知道分布式服务器是怎么回事了、客户端跟服务器通信的流程是怎么样的?怎么样保证服务器的高性能
[*]而且我们服务器的冗余非常小,当你把服务器的协议定义好以后,架构里就直接帮你把服务器的数据库、服务器跟客户端通讯的协议生成好了,这是一套基于商业项目的解决方案

[*]S2:帧同步的客户端和服务器架构

[*]接着我们就会进入到S2部分,在这里我们会学习到帧同步的客户端跟服务器的架构
[*]什么叫帧同步呢?

[*]传统的网络游戏,就是玩家发出一个操作到服务器,比如走、跑、跳、攻击、防御、技能释放这样一些命令,发到服务器以后,服务器会计算,然后传递,比如把攻击防御的结果返回给客户端,如果是移动操作,那么就发送移动以后的角色坐标给用户的客户端
[*]但帧同步不一样,因为传统的这种方式在开发游戏的过程中要传输的数据量是很大的,比如一个角色走、跑、跳,那么我就要把走、跑、跳的三维坐标发送给我的客户端,还要不停同步其他玩家的坐标数据,本身传递的数据量就已经很大了,还要把这些数据同步给其他客户端,所以开销就更大了
[*]那该怎么办呢?这时就会采用帧同步,帧同步就是当玩家执行某一个操作后发给服务器时,服务器不会做运算,会直接把这个消息广播给所有客户端,比如移动命令,我直接传到服务器,服务器不做运算,直接把消息广播给别的客户端,它的通讯量只是你按了几个键、按了什么键

[*]《王者荣耀》就是采用帧同步的方式来实现它的战斗的,所以《王者荣耀》的实时性和打击感做得很好。这是什么原理呢?因为他把所有的运算都放在游戏的客户端,这时服务器的性能瓶颈就在于它的数据传输和转发能力,我们要把它做到极高
[*]当然服务器还有一件事情要做,就是在战斗前后的玩家资源管理,比如玩家的皮肤、道具管理、角色管理、匹配的管理,这都是服务器要做的
[*]这是帧同步架构服务器的能力要求,我们的项目需要能够适应这样的服务器架构
[*]我们在做完了服务器架构设计以后,把所有的功能实现完了以后,我们还亲自做了机器人的压力测试,我们的服务器是能够明确的支持万人同服的,所以这个就不是我们平时所看到的那种玩具代码所能够实现的功能,它是一个真正的商业项目架构
[*]如果你看到一个玩具项目,就是写完数据库的协议、还要写网络协议、还要写序列化协议、还没有数据缓存,整个项目也没有实时竞技的元素在,那么这个项目的难度、它对你学习能力的锻炼、通过实战项目去锻炼的价值就没有那么高,这也是我们在学习时要注意的
[*]那么针同步的难点在哪里呢?为什么我们说帧同步游戏是一个实时竞技游戏呢?

[*]我用我们的《皇室战争》举个例子:我出了一张卡牌,这张卡牌变成游戏单位行动时,它是由你来控制的吗?不是,它是由游戏的AI来进行游戏技能释放,游戏的战斗
[*]所以它的游戏AI会非常复杂,而且由于所有的运算都是每一帧实时运算的,所以这是你在开发开发回合制游戏,那些慢吞吞的游戏,慢节奏的游戏时,可能不会碰到的问题,但这些问题会在实时竞技游戏里暴露出来,你在实时竞技游戏中所得到的锻炼跟传统的回合制游戏是不太一样的
[*]而且帧同步有很多的开发要点,客户端有很多坑点和可以对你形成经验的点在里面,一些同学完了我们的S2课程以后就没有学后续的课程,只是学习了S1加S2包括前面后面的一些基础知识,经过后面的面试准备(这些大概两三个月时间可以学完),然后去面试,很多时候面试官都会对他刮目相看,甚至在某些问题上面试官的熟悉程度可能还没有我们的同学来得高
[*]这就是我们的商业项目课程想带给大家的能力提升!


[*]S3:双端热更新

[*]开发完S2以后,我们会进入到更加深入的S3环节,在前面的S1课程中,我们已经实现了代码热更新,但S1中的代码热更只是在客户端中进行热更,在我们的S3里会再去深入代码热更新,我们S3课程是客户端热更新加服务器热更新
[*]有同学可能会说:服务器要热更新干什么?因为如果你有一个大型的游戏项目,而这个项目经常需要停服热更的话,那这对游戏公司的运营损失是很大的
[*]所以当出现一些小bug或者一些比较严重的bug时,而我们又暂时不能停服,那么我们完全可以实现服务器的实时热更新
[*]当然,实时热更新不是直接在生产服务器上更新,因为我们直接把刚敲完的代码直接放上服务器的风险是极大的,我们要有一套完整的流程,我们会先在我们的开发服务器上做测试,然后实时的把它更新到支持热更新的服务器上
[*]还有客户端部分,我们的ILRunTime能够很好的支持客户端的热更新,并且ILRunTime不需要学另外一门编程语言,传统热更新是用Lua来做的,我们之前的课程也是用Lua来做热更新,而且我们的Lua课程讲的非常不错,我们从基本的使用到Lua在ToLua、XLua中使用、到它的底层原理、它的性能瓶颈点、它的源码实现、Lua跟C#的脚本绑定、GC的开销、方方面面都对它做了系统的分析
[*]所以不管你是用ILRunTime还是ToLua,如果学过这些点,那么你就能在面试中回答这些问题时,跟别人产生的差距也就能体现出来,很多同学在面试时是面试官问个问题,他就答一个问题
[*]我举个例子:面试官会问你Lua在编程时的性能瓶颈在哪里?Lua对象用完以后要如何回收它?Lua与C#交互的原理是什么?这不是我瞎说的,这都是我们的同学实实在在的去面试,包括我去面试一些基础的程序员时会提到一些问题
[*]面对这些问题如果你只能达到一句话答完了,那么你给面试官的印象就比较一般,所以同学们在面试时,除了能答到它的一些基本注意点,还要说明为什么会有这样的问题存在、这个问题该如何解决,这样你给面试官的印象就是完全不同的
[*]这是我们S3的内容,不管你是用ToLua、XLua、还是用ILRunTime,它都存在一个对底层原理的学习,你不学习底层原理,那你怎么能理解它的优化方式呢?你怎么能把这个东西用好呢?
[*]所以S3不是针对ToLua、Xlua或者ILRunTime,虽然我们是以ILRunTime来举例的,但并不是说热更新只能用ILRunTime,你要理解它们的原理,当你理解了原理,理解了底层的实现,你就会豁然开朗
[*]所以学习时要学一个方法,不要去强调一些具体的使用,比如服务器用什么语言、服务器或者客户端热更用什么语言,这都是最低层次的问题,我们应该是关心的是它们背后的技术,如果你去大厂面试,你就会发现面试的人很少会问你Lua怎么用?Lua中的for循环怎么写?没有人会问你这些

[*]S4:发现问题,解决问题,项目迭代

[*]S1到S3学完以后就可以掌握一套完整的从客户端到服务器的架构到技术实现的方法方式,以及各种业务逻辑该怎么实现
[*]初学的同学们如果把S1学完之后,面试客户端开发是没有什么问题的;S1加S2学完就能够高薪入行;对于刚入行的同学,那么我们对S2的要求就没有那么高,但如果你是有经验的开发者,想进一步提升,那么我们建议大家学完S2加S3,并且要对S2和S3的内容有充分的理解,老师也会笔试面试模拟环节来帮大家进一步巩固,通过模拟面试的方式来帮大家提升对知识的理解,当然还有其他的方式也能帮助大家理解知识:我们的课程还提供了一对一指导和每周直播
[*]那么在我们的S4里能学到什么呢?我们怎么样通过商业项目来提升呢?

[*]S1到S3实际上就是从原型开发到项目架构到具体功能实现的过程(也包括了项目的迭代),到S4以后就相当于我们的商业项目进入了后期
[*]从框架到业务逻辑全部实现以后,我们可能会发现有各种各样的问题,所以S4课程特别适合一些想要进阶的同学,想要成为游戏主程的同学来学习
[*]你平时如果只是做UI、做逻辑、接SDK,你可能发现不了这些问题,我们会从规模、架构、底层实现的角度来提炼发现一些问题
[*]然后我们会教大家如何解决这些问题,也就是我们的S1到S4形成一个项目闭环,你能学到完整的开发过程,从第一轮开发到第二轮开发到第三轮开发,它有一个完整的项目迭代过程

[*]大家如果想知道我们在S4课程里是如何发现问题、解决问题,然后做项目迭代的话,大家可以在文末加一下我们的爱丽丝老师来了解我们的课程详情

架构优化




[*]刚才我们主要讲了一下项目的开发过程,在项目开发里的每个阶段要做什么事,要掌握什么样的工作技能,接下面我们就来看一看,在我们进入到第四个阶段以后,我们会发现什么问题、要解决什么问题、要做哪些项目迭代
[*]1、退出战斗或游戏时报错

[*]很多同学在开发小型游戏时,他的进入游戏,游戏的基本战斗都没有问题,但每当想要退出战斗或退出整个游戏项目时就会报错
[*]如果你开发的是一个小游戏,那这个问题不会太明显,因为你的游戏的对象比较少,要处理的数据量少,所以就不会有这么多问题
[*]但问题是如果你的对象多一点,那么就会有这样的问题,这个问题是怎么造成的呢?

[*]我跟大家举个例子:你有A、B、C3个GameObject,每个GameObject上都挂了相同类型的组件,每个组件上都有一个Start方法
[*]那么你能告诉我这3个对象哪个先Start,哪个后Start吗?它可能第一次执行时是A的Start先执行,然后是B,最后是C;第二次启动时可能是B先执行,第三次可能是C先执行
[*]所以它们的顺序是不确定的,那么再假设这三个对象之间有一些依赖关系,比如B中有一个X字段,A初始化的Start方法里有一个Y字段,它是X的平方,那如果现在程序的启动顺序是B先启动,然后A再启动,那么这没有什么问题,但是反过来呢?如果是A先启动,然后B再启动,这样的话Y就获取不到有效X的值,程序就会报错了

[*]这是我们在启动时会碰到的问题,那么在退出时是不是也会遇到一样的问题呢?如果你没有做过商业项目,那么你很少会关心程序退出时的一些问题,因为大家可能觉得做游戏就是要爽,只要把游戏功能做出来,爽了就行了,至于退出时有没有错,报不报错,就完全放到脑后去了,如果你是刚入行的同学或者在学习的同学,那么你可能是不会考虑到这个问题的
[*]那么怎么解决呢?我们需要自己管理程序的生命周期,这就是架构中第一个要优化的点

[*]2、如何管理多次出现或数量较多的对象

[*]我举个例子:商业游戏里肯定有很多游戏实体,有UI实体、非UI实体、角色实体、道具实体,我们以角色为例,比如我有一个角色实体,角色头顶上有一个血条实体,角色身上还有一个挂件实体,血条有它自己的属性数值,挂件也有它自己的属性数值,那么你要怎样管理角色实体,以及角色实体身上的血条和挂件呢?
[*]从位置关系上来看这个实体,血条要跟着实体走,所以它们是父子关系,从数据管理的角度上来说,血条和挂件是角色实体的一部分,这里面要怎么管理,大家可以自己想一想,可以把你们认为对的答案发在评论区
[*]不管是MOBA、ARPG、回合制、放置游戏,大多会存在一个子弹对象,什么叫子弹呢?释放的技能就可以叫子弹,不一定非要是射击游戏里的子弹,比如我们的《皇室战争》里就有很多的子弹,它可能是发射出去的火球,也有可能是发射出去的箭,我们可以无限的拓展它
[*]那这时你的游戏单位列表应该如何管理呢?你有很多种对象,比如道具列表、角色实体列表、角色列表等等,那在管理时如何避免代码重复,这也是一个问题

[*]3、异步性能太低,协程太分散,该如何管理

[*]有些同学会在程序里大量使用协程或者异步,大家要知道:不管是协程还是异步,它都是由CLR框架来管理的,并且不管你是用Lua,还是用的ILRunTime,它都是一种程序脚本
[*]既然是脚本,那都是有脚本层的调用开销的,在这里就存在一个性能问题,那么这个性能问题该怎么解决呢?另外还有一个问题就是:很多时候我们使用异步主要就是两个目的

[*]1、延时
[*]2、资源的异步加载
[*]如果我们能解决这两种异步产生的问题,那么我们就可以取得更好的性能效果

[*]如果我们使用协程呢?因为异步底层也是CLR通过协程来实现的,如果程序里过多的使用了异步或者协程,那对CLR的管理开销是比较大的
[*]这就好比我们在程序中创建了很多的线程,大家知道:线程的好处是可以一起干活,而多线程的坏处也正是它的好处带来的,因为当你创建了很多线程时,线程本身带来的开销就是很大的,线程调度带来的开销也是很大的,这种东西如果你不碰到大型项目,并且没有工作经验,那么你是很难接触到的
[*]这就是架构要优化的点,它会出现难以管理的问题,而我们的项目已经把这些问题全部都解决掉了,所以它跟你自己做着玩的项目是不一样的,我看到B站上也有大学生会发自己做的项目作品,看起来效果做的不错,作为一个大学生做了这么多,但仔细一看,就能发现这个项目只是将AssetStore中的项目稍微改改做出来的项目,那种项目是没有任何价值的,对大家的毕业其实也帮助不大,如果你想进入游戏行业,那这个项目对你来说是没什么用处的

[*]4、异步的流程管理

[*]使用异步就会存在一个问题:当你的程序是异步时,你的程序就会产生很多不能确定在什么时机执行的程序流程,因为异步程序不是在这一帧就启动的,它是在另外一帧或者另外很多帧以后才去执行,而且它是定时执行的,它不像同步程序,执行顺序很明确
[*]所以它也不便于管理,但有时我们又不得不使用异步,那么就存在一个问题:能不能在不需要用异步时把它同步化
[*]这是要从程序的结构上来做的优化点,实现的话就能给我们带来很多好处

[*]1,可以提高程序性能
[*]2,可以让程序更加稳定

[*]但有些时候我可能不得不用到异步,这其实也是可以优化的,比如下面的一个问题

[*]5、卡牌”变兵“时的卡顿

[*]这是我们在开发《皇室战争》时碰到的问题:战斗时的每个兵种、每一种卡牌,在第一次放到场景中变成游戏单位时,都会稍微卡一下
[*]如果你是一个有经验的开发者,那么你一定会碰到测试跟你说这样的问题,而且这是一个非常高频的面试考点,那卡了怎么办呢?大部分同学也许都能答出来:

[*]使用对象池

[*]但问题是:如果你仅仅只回答这一点,那说明你的开发经验还是太不足,因为对象池本身也是有使用开销的,如果你用不好,那你就会在战斗过程中造成更大的卡顿
[*]我们知道对象池的原理:当对象不够时就会创建新对象对,那么你在战斗时创建对象肯定会造成卡顿,这在我们的项目中都会有相应的解决方案

[*]6、对象池中的对象随着战斗单位的增多而膨胀

[*]比如对象池里原本有五个对象,那但当这五个对象不够用时有什么处理方法呢?

[*]直接实例化一个新的对象,但它可能会卡顿,特别是战斗的时候

[*]那么我应该怎样避免在战斗时的实例化造成的卡顿呢?而且如果不停的实例化对象,那么又会造成对象池的膨胀,比如我一局战斗中用到了50个对象,这些都是从对象池取出来的,那么我的对象池里就必须要保证有50个对象,也就是要实例化50个对象,那在这局游戏进行的过程中要增加对象或者这局游戏结束了,对象池里的对象不用了,该怎么办呢?
[*]这就又牵涉到了Mono的内存管理问题,这些会在我们的课程里教给大家

[*]7、对象池扩容卡顿
[*]8、UI模块逻辑多了难以维护

[*]如果你的UI很简单,只有10行20行代码,或者100行代码,那就不用担心这个问题
[*]但如果你有200或者300行代码,甚至是四五百行代码,那你就要注意怎么样去解耦了

AA的优化


[*]1、如何最大化利用AA资源管理的优势

[*]我们的AA,也就是Addressable也是可以优化的,我先给大家介绍一下AA的能力:使用AA可以在一小时以内做完资源热更新功能,传统的AssetBundle方式是不可能达到这种效率的
[*]因为AssetBundle打包的策略选择、打包的功能定制、打包的工具编写,光这些你可能就得花一两天,甚至对于新手可能要一个礼拜,而且资源的释放问题都要你自己处理
[*]但是AA只需要遵守AA的编程规范就不会犯错,所以AA很简单,但要把AA用好还是需要对AA有更深入的理解,我们需要在学习时掌握AA的底层机制,包括面板上每一个选项的含义

[*]2、AA能实现自动打包吗?

[*]不能每打一次包都需要手动去打,我们在出版本时、出包时如果能实现自动化打包能节省很多精力

[*]3、AA能定制打包规则吗?

[*]如果你很熟悉AA,那么你就能够针对AA来实现打包规则定制

[*]4、AA资源冗余能否优化

[*]AA本身比AB(AssetBundle)好的地方就是它有一个功能拓展,可以通过功能扩展来实现资源冗余的优化
[*]我们的框架对AA本身提出的资源冗余检测和优化方案做了进一步的升级,成为了第二代的资源优化方案
[*]关于什么是资源冗余优化,大家可以看我之前的关于资源热更新的公开课

[*]5、AA怎样做到下载时全部更新完毕再进游戏?如何显示下载进度?

[*]AA默认的方式就是资源随用随更新,比如角色模型发生了变化,那么当我加载时,AA就会去下载这个资源
[*]但这种方式有个缺点:如果我在战斗时刚好要加载这个模型,那这个时候再去下载资源就会造成程序的卡顿,这就造成了游戏游玩体验的延迟
[*]所以怎样能做到下载时全部更新完再进游戏呢?这需要我们对Addressable的底层的API机制非常熟悉,并且我们要实现一套完整无错的解决方案
[*]这样的话我们就可以下载全部资源再进游戏,并且能显示它的下载进度

[*]6、AA远程下载的缓存机制是是什么样的

[*]什么叫缓存机制?当我远程下载的资源很多,不可能一次把下载完时,我们就要考虑到一个问题:如果我的资源在下载的过程中断网了,比如进地铁了,或者进了一个信号非常不好的地方,下载中断了,难道我们要重新把资源下载一次吗?AA会不会重新下载资源?如果要重新下载资源,那怎样最小化资源的下载量呢?
[*]这都是我们在商业游戏里需要考虑的

[*]7、如何打包才能达到资源更新的最小开销,并且能够合理的验证资源的版本是否更新

[*]这需要我们理解一些AA的打包优化策略

ILRunTime优化


[*]ILRunTime的优化包括两点:
[*]1、如何优化ILRunTime,有哪些手段

[*]游戏战斗过程中,游戏单位增多时GC开销比较大,CPU运行卡顿,这个问题无关使用ILRunTime还是用ToLua,它们都会有这个问题
[*]其实ILRunTime在性能调试时比ToLua、或者XLua方便的多,为什么?因为ILRunTime的底层就是C#,所以你可以直接通过Unity的性能图表Profiler看到它的内存、垃圾的开销
[*]内存垃圾除了占用内存以外,还会造成CPU的卡顿,那么我们如何优化这个卡顿呢?这个问题的关键就是你能不能读懂它的性能图表、读懂以后知不知道性能图表产生问题的原因在哪里、如何优化、优化时有哪几种方法
[*]这是第一个点,也是决定你能不能进阶到资深程序,或者成为游戏公司主程的一个技能点

[*]2、ILRunTime的性能如何最大化

[*]有同学会问:ILRunTime跟Lua的性能比究竟怎么样?
[*]很多同学不了解,只是在网上看了两篇文章以后,就说ILRunTime的性能没有Lua好,我可以告诉大家这是无稽之谈,大家知道这些网上的文章是怎么测评的吗?他是不是按照ILRUnTime官方的指引,设置了正确的选项以后再开始做比较的呢?
[*]这就好比两个人比赛跑步,一个人在起跑时之前先跑了五米、十米,然后说后面的人跑得慢,这是完全不公平的,而且是完全无知的
[*]ILRUnTime不仅性能不比Lua差,甚至在某些方面性能是远远超过基于Lua的解决方案的,不管是ToLua还是XLua
[*]至于为什么和如何实现,大家可以参考我们的VIP课程

小结




[*]最后我们做个小结:
[*]今天我们讲解了:

[*]1,游戏开发的阶段
[*]2,在什么阶段要做架构

[*]在每一次迭代的过程中,在每次迭代的开始都要去做架构,都要去做架构的优化迭代
[*]做架构和架构优化其实是同一个问题,在每一次迭代的过程中,我们要持续不断的对架构、对具体的功能实现做迭代,在这个过程中架构肯定是要优先的,因为你的架构能决定你的业务逻辑,而你的业务逻辑决定不了你的架构

[*]3,帧同步的优化要点

[*]如果你有一个帧同步项目,那么它对你的跳槽和面试上的加分是有非常大的帮助的

[*]4,代码热更新的优化要点
[*]5,,资源热更新的优化要点

进一步学习的内容




[*]希望大家在平时多思考一些技术问题,当然如果你要想系统的学习到这里的每一个解决方案,就可以考虑参加我们的课程
[*]我想强调一点就是说做比说更重要,我们刚才也提到了一些问题的解决方案,但如果你不亲自做一遍,你是不会清楚它里面的每一个坑点在哪里的,并且也不能深入的理解它,并形成一个深刻的印象,所以说这才是学习的要义所在
[*]大家想一下我们游戏开发里比较难的几大技术

[*]图形学
[*]热更新
[*]项目的架构
[*]分布式服务器
[*]压力测试
[*]帧同步

[*]你说这几项技术有什么难的?我举个例子:热更新不就是把Lua跟Unity的原生的C#代码绑定一下吗?说谁都会说,但当你做的时候,你就会发现它的细节是非常多的,坑点是很多的
[*]如果你觉得你能一点点解决这些坑点,你能承受它所带来的时间成本,学习代价的成本,那么大家可以考虑自学,但如果你想要快速的在你的职业生涯上进阶,想走得更远,那么大家也可以考虑学习我们的课程
学习路线

VIP服务

写在最后


[*]更多学习资源请加QQ:1517069595或WX:alice17173获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
[*]点赞、关注、分享可免费获得配套学习资源
[*]点击观看完整视频
页: [1]
查看完整版本: 主程/架构师进阶 大师攻略