00:00
大家好,欢迎来到自己教育课程的学习,本系列课程呢是自学教育的第一季,从零开始搭建游戏服务器,本节课呢是第二节。从主函数开始写架构是如何设计的?好,我们,呃这节课呢,是两个知识点,一个就是我们公众平台的一些介绍,第二就是我们实际大家写代码,呃,服务器的架构,还有一些我们漫函数的一个实现。首先呢,我们看第一个,这是我们社区公众平台的订阅号,大家可以关注一下,关注之后呢,大家可以回复关键字客服呢,就会获取到我们助教的一个微信信息。大家如果后面有对课程有意见,或者课程的一些安排啊,一些改动啊,大家可以咨询我们助教就可以了。好,我们大家讲第二个知识点,就是我们本节课的主要内容,服务器的一个架构和慢函数的一个实现啊。好。啊,那我们正式开始啊,在讲课之前呢,我们先来给大家说一下我们整个这个服务器架构什么样子的。
01:02
这样呢,对于我们后面的开发呢,有一个大致的一个呃,一个方向,那我们开始啊,给大家先。说一下,给大家放大一下。在这里呢,我们就是要。So。Server呢,我们其实呃,在我们整个这个课程当中啊,我们没有,我们只给大家实现,其实正常游戏附加构来说一下啊,正常的是我们有。Gateway网关服务器,还有我们的games so。Game server呢,就是我们的游戏服务器啊,还有其他的,比如说排行榜服务器啊,还有DB server。呃,这是我们正常的一个有一个服务器架构,比如还有其他的啊,其他的我就不写了。
02:03
但是在我们整个社区的这第一期当中呢,我给大家主动讲的是。是没有DB的,第一期是没有的。呃,Getaway,那么网关服务器呢,也是没有的,我现在给大家第一期讲的内容呢,只是我们game server给大家讲是game server逻辑,为什么只讲game server逻辑呢?就给大家说说一下,因为game server的网络端口的话,和我们getway的网络端口呢,其实很相似的。所以说呢,我们把so的网络网络层搭建完成之后呢,就可以单独的备份一份作为我们盖备就可以了。理解我说的吧,好,那我们呃,甘位先去掉。那么我们server这里面给大家实现的一些内容是什么呢?词的内容是这样子。Game server,那我们首先呢,我们的网络接口,也就是net接口。蛋蛋,我们用什么?我们用的是OB。
03:04
我们sorry,同学。我网络接口DB呢。DB值分为两种,那我们给大家说一下,第一个就是我们的MYSQL。第二个就是我们的。这是作为排行榜来用的。DB net,还有一个我们的一个什么网络接口,DB接口,那我们这儿就是我们的其他逻辑了。比如说。MSG的消息的虚列化呀,对吧。市绿化等等。好,这是我们整个GAME45还有其他的,其他的话,我就这边就等等了。这边就等等啊,就不写了,大家后面我们再跟大家说,首先呢,我们给game so的话,实现大致是这样的一个逻辑。
04:05
所以呢,我们game server的网络层的是web socket的DB是买circle,因为它是它首先呢,它是game server,它就可以直接给我们DB连也可以,或者在后期的话,我们这加个DBSO也是可以的,嗯。做集群呢,都是可以的,好,那么我们今天开始呢,就给大家讲一下game server是如何从零开始,给大家一步步敲代码,怎么敲出来我们的整个的game so的一个逻辑。整个架构先大家理解了吧,后面呢,我们主要围绕game so来做。那好,我们正式给大家开始啊,开始呢我们再用CLASS3啊,这里边呢,Src这个目录结构我就不说了,这个比较简单,这个如果大家不懂的话。我建议去学我们基础课程啊,公务员的基础经济提高课程,好,我们先给大家建一个文件啊。见我们叫,我们叫什么呢?一般我叫T文件,这个大家可以随便呃随便建啊,这是在讲课之前呢,我给大家说一下,回到我们正题上,回到我们PPT上,给大家说一下,我们这个代码呢,我是不打算传给传到get HUB上去了,因为我觉得大家还是跟着我视频去一步步敲代码就可以了。
05:17
这样呢,是对你提升比较快的,如果你直接拿代码的话,你就直接会把它运行起来,那这样对你来说没有什么没有多大提升的,所以整个课程而言呢。从开从现在开始到我们正式项目这个第一期完结束呢,我也不会把代码交给大家了,大家去一步步敲,如果有问题的话去我们群里问就可以了。OK。我们继续啊。首先呢,在这里面呢,今天呢,我给大家呃,主要讲。一下我们慢函数啊,那很简单了是吧,首先呢,我们建完文件之后,那这里先放大一点啊。可能看不到。嗯,这样应该大小应该可靠。这个package大家都知道吧,开始慢,这个肯定可以,那么我们首先呢,要有一个it函数,也就是初始化函数,初始化函数大家一定要写,这个在我们服务器当中做初始化是很重要的。
06:10
这块给大家做做个备注啊,就是我们做一些。游戏服务器的初始化工作。游戏服务器的。初始化。初始化工作。OK,那么这是我们初始化函数,那么下面呢,我们肯定要有主函数啊,主函数是我们的整个项目的入口UNC,然后慢函数对吧。那么我main函数做什么呢?这就是我们原来说的,今天呢,给大家讲的是我们一个服务器,那我们给大家建一个什么。我是计划给大家建一个呃,HTTP服务器啊,因为我们我们最后看架构上,架构是we socket,那HTTP和we socket很像的,所以说今天呢,因为我们要加第三方库嘛,三方库我们是在下一课讲,所以下一课呢,我们一起把卧S方库加起来之后呢,就可以连通了,而今天呢,给大家讲呢,就给大家讲演演示个简单例子,用HTTP服务器给大家讲一下。
07:10
好,那我们用HTTP大奖呢,这块首先呢,我们要包含HTTP的包是吧,那我们网络包要包含进来,那么iport。导入。导致我们括号,那么第一个大家知道我们网络库的包是什么吗?HTTTP的是什么?就是p net http,大家这网络包如果不熟悉的话,大家看一下标准库,或者找一下相应的资料看一下。因为这不是不是基础课程了,这是进阶课程,我就不需要讲那么太多详细了,那么主函数这块怎么办呢?主函数我们做什么?HTTP服务器大家会不会HDHTTP什么?他有一个有一个什么。炸鸡的不用。Hac,大家记不记得?Handle。C,也就是这个是我们。
08:03
HTP服务器处理的,那么这里面呢,需要两个参数啊,这两个参数呢,第一个就是我们路由,我们路由的话就直接。是在根木的就可以了,那么我们下面呢,就是我们的一个函数,那么我们这个函数写什么呢。写什么?写勾函数写什么呢?我们在这里写一个呗。正常是这样子的,我们是主函数在这里,那么我们正常写函数的时候,我建议大家还是新建一个。这属于逻辑函数,那么。我们这在新疆有人接没?也是可以的,建议大家新建一个,因为这是需要一个一个代码管理的东西啊。Ttp。这是没问题的啊。二七点哥。HTTP点,那么这个同样的也是我们。Package是吧?那么这个呢,我们就MMC,那么我们这是什么呢?我们叫勾浪ltd行不行叫我们社区,对,前面加上3W,这是我们社区的网网论坛网址。
09:05
那么他做什么呢?大家说我们这个做什么?我们打印一个数据就可以吧,对吧,打印一个数据就没什么问题,那打印数据的话,我们这包含一个。呃,我们今天给大家就是讲个例子,那我们就不加日志,不用用普通的直接打印出来就可以了,当然来给大家说下,在我们正常当中呢,是不这样打印的啊,因为这样的。呃,感觉服务器架构就比较low了,那么这呢,第一个参数就是我们,呃,一般都是写成W,也就是我们。给大家央是相当于这个我们给给浏览器返回的一个信息,也就是RA信息啊TP它什么呢。他是啊。Is。Upon。吧,看就是没有,我们到时候后下节课给大家用,给大家写吧,因为这个可能提示比较没有,没有提示好一点,没有的明明显一点,这个呢,我们就R应该是。
10:11
所以这块呢,是我们的一个。有信号的一个,那么我们就HTTP。型号在这边。也就是tdp后面应该是request。阿姨。I request you。EST。Request OK。好这样子呢,我们这样就返回浏览器一个信息,那我们就什么MMT,大家觉得返回什么,记不记得LP是什么。大家记不记得有没有,有没有不熟悉的,这个我们HTP服务器什么样子。怎么写的?好,我们就write这块,返回一个我们信息就可以write,后面我们返回一个什么。
11:02
社区欢迎你呗,行不行,Go浪。语言社区。欢迎你。欢迎欢迎你吧,一般都是你的意思比较真诚吧,是吧。欢迎你好。一个。这样子呢,我们写完之后呢,我们就直接可以调用到这边,在这边直接一个函数,那么我们是直接把我们的函数写进来就可以OK。然后这边呢,大家看到HTP服务器,首先呢,你做一个路由操作。看到NC,这是我们作为这前面第一个参数路由,第二是我们路由的一个函数。就是路由实行之后的函数,那么我们下面是什么?HTTP什么HTP必须有监听端口。大家。Lesson吧,是没有提示sent。
12:02
T e and。And,我。好,那么我们这样子。第一个参数什么?第一个参数是我们的。那么我就直接。四个八吧,888好听的。Wow吧,不有吉利吗?其实正常的,我们这边有一个返回的一个错误,网络如果出现错误的话,我们到时候怎么去处理。这块就不给大家呃打印了,因为我们这节课主主要内容还不是这里啊。好,那么这个我们TPU就要建完了,呃,我们先运行一下,看可不可以运行啊。哦,那我们要包含进来。我们再编一下。The cast在哪?
13:01
Http request什么?没有定义request的。Request。这英文还是硬伤啊,是吧?OK,那我们执行一下呗。呃,我们看一下我们是什么。那我现在执行起来了,那我们用浏览器给大家演示一下呗。这大家都知道吧,那我我觉得。这是比较简单啊。嗯,Local哈斯也可以啊。R170.0点。零点零点。啊。完了之后呢,我们就就可以了,看狗粮社区欢迎你。
14:00
能看到吧,我放大一点。喜欢鼓浪社区,欢迎你啊,没什么问题吧?这是我们返回的好。我们。这是我们建完了,就是相当于我们将在HP服务器啊,但是这个后面的话,我们下一课直接改成加入第三方包,加入那个文波S之后呢,其实还是一个样子啊,只是我们在这做了一个处理。好,当然这节课不是重点,重点的是我们能给大家抛出个东西来啊。因为重点的TP不是很简单的,虽然跟我们下有一些联系吧。这呢,我给大家要说一个事情出来,就是在这里面呢,我们是在主函数慢里面呢,要多核利用,要利用一个多核。就是游戏服务,游戏服务器开发呢。服务器,服务器开发呢如何?如何利用?利用CPU的。大家觉得我们C加加怎么利用?大家用C加加或者Java开发过游戏服务器没?或者开发其他游戏,你怎么利用多好?
15:03
有没有人知道?自己不知道,去百度一下,我也不知道那个家网是怎么利用的,这家还知道,那我们购物服务器是,呃,购物员服务器是怎么利用的呢?首先呢给大家说一下。高语言服务器呢,我们是可以指定多核来运行的。多和来英雄的概念是什么样子,比如说我默认的话,嗯,是。我默认的话,其实该五元中是最大核,比如我们系统是八核的啊,那么勾员默认的话,其实是八核运行的,比如你呃,这涉及到一个呃,Go root一个调度问题了,勾入成调度问题的话,这块大家我觉得应该有经验吧,应该了解吧,我就不在这讲了,我只讲。不知道的大家小伙伴去下课堂去,自己去研究一下going是如何调度。就是这直接会涉及到一个我们利用多核的一些概念啊。好,那么我们说一下利用多核呢,其实就是。让我们怎么计算的嘛,快一点,那么定多后是怎么操作呢?在购员工是这样,直接可以run time。
16:06
Ron。T。下面有一个叫。Marks。都是大写的吗?Marks。PLCS吧,Pro。S。它的下面呢,就是我们指定多核,比如我们指定十个呀,100个啊。手上要有啊。看看有没有100盒,你必须有。那么首先呢,默认指指令一核指认离核双核都可以的,但是呢,我们不用我们系统呢,其实给大家提供了一个。Runtime runtime吗?T。Time。Runtime的后面给我们点什么?Number叫number CPU吧。
17:00
CPU。它这个函数啊。它函数,那么我默认的是乘以二的,也就这样。对打,比如那这样子可能大家看不清啊,那我们这样子。我们看我们系统是几何的呗,对吧。那么我们下面就把它打印出来。嗯。好,我们把多少打印出来,看它是几分就可以了。有没有错,没写错,我们这样的是说明一下。本机纸盒。机。好,我们编一下。
18:02
本人啊,这里有一个错误。PI。多核的话,我们是在游戏方案中必须要设置的。Runtime没有,Runtime没有是什么意思?我们这没有runtime吗?那我们把它包含进来就可以呗。这个不像勾烂的,可以自己添加啊,这个比较比较烦。好,我们还是执行一下,看四核的本机多少核,四核,那OK,那我们机器是四核的吧,以前我也不知道是几核的,今天知道了,今天是指的四核的。给测一下你机器是几核的?你说我不知道吗?我应该知道的吧。电脑我配的吗?OK,那这样子。呃,说到runtime这一块呢,就为大家说了一个另外一个知识点,也就是给大家呃。
19:04
说的另外一个就是我们那个。设置涉及到一个GOGO当中呢,勾元当中一个什么runtime的一个go ma p r CS,有这个函数呢,我们设置是导致性能的一个问题啊。因为这个设置的话,大家设置如果设置不好的话,会存在一个性能问题,那么怎么才能避免这个性能问题呢。好,那我们大家就给大家简单说一下啊。首先给大家明确几个几个问题啊,也就是说呃,我们首先我不知道大家明呃明不明确并行和并发的一个区别啊,大家在自己脑海里先。补一下这个知识点,并发和并发并行的一个区别是什么?自己补一下。其实呢,呃,主要概括的来说啊,就是并发呢,一般都是怎么。在呃,在那个CPU的核内。通过时间片或者中断来控制的。
20:00
一旦一个遇到一个什么IO阻塞啊,或者时间片用完呢,就会转到一个现成的一个使用权。单核下呢,就不可能有并行的,因为不能有并行的一个存在了,也就是说必须是我们在l lo阻塞时间片用完的时候呢,切换到转移到现城的一个使用权,也就是你在单核的话,不存在那一个对吧,这种情况不存在一个并行情况。同时呢,只能有一个任务在调度,这个跟我们调度,跟我们CPU的,包括我们呃Linux内核调度是很有关系的,我建议大家如果这不明白的话。去我们的列尼克斯内河编程的话,大家去看一下。如果有需要不懂的话,大家去我们群里边私聊我,我给大家再给大家细说一下,去给大家补一下这个东西。那么在go言中呢,就是我们这个函数啊,Runtime,一个go mask prol CS。可以试试多核执行任务啊。就并行呢,比较适合于一个,他来做呢,就比较适合一个什么呀,就是CPU计算密集型的计算比较多的,像我们游戏服务器呢,其实就属于CPU计算密集型的。
21:05
它并不像我们呃DB server或者我们DB服务器的话,它是作为一个IO操作磁盘IO处理的话,比较密集型的,因为数据库就是存盘嘛。如果是IO密集型呢,利用多核呢,就是因为它需要切换嘛。I密型,就是刚才给大家说那个我们像数据库这一块,数据库存储或者是文件系统这一块操作的话,那就会切换一个什么,切换CPU这个成本这一块。好,那我们继续给大家说啊完,我给大家举个例子吧,就是嗯。就是举例子之前嘛,我们需要明确一下,就是明确一点。就是在你测试并发的时候呢,往往会把一个函数写成一个死循环,并计算并发的时候,大家做没做这件事情。有没有这样,有没有这样子的。有没有Ford?爆一个爆一个处在这里。画一个在这里。
22:01
我直接这样子。有没有勾什么东西啊,什么死循环啊,对吧,一个死循环在这里面勾一个函数MUC啊或者是对吧。有没有这样做的,就那你机器会被卡死,我们现在运行的话直接会卡死啊,大家写个函数,我们就用这这个函数就可以,其实。直接会卡死的,不会卡死会很慢,慢慢的会系统你鼠标都移不动,你试一下啊。并发这一般在测试的话,我觉得其实过员的话,你要没这种这种这种神操作的话,你就没学没有没有去没有去体验一下过员的一个。一个相当于一个好玩的地方,必须这么写一下,你看你机器能不能跑动,或者能不能像我像兵哥这样说的一样,就卡住了,或者鼠标动不了了,只有只有自己重启了才可以,好,我们继续啊。呃,就是如果我们用刚才说了,用它用go来实现一个并发啊,这加一个函数就可以实现一个并发了。
23:00
啊,这块就可以实现并发了,你随便写一个什么东西啊,对吧,只要它是函数,那你就实现了一个并发的一个功能。但是你会发现呢,就是怎么有些东西呢,呃,我们在这块如果不加上这句函数的话,有些东西它直接执行不了的这个函数,为什么。因为他会直接退出啊,会资源会释放,有的时候我们必须加,呃,大家都肯定做过,就time什么sleep啊对吧,来操作的一个事情,肯定做过的事情,或者是加一个等待时间嘛,相当于对吧,这对。呃,这是为什么呢?就是给大家解释一下,就是构员呢,自己管理一个构筑体,如果你的一个函数呢,始终不释放资源,也就是说我们。我们这一个time的时候,始终不算上资源的,那么going呢,就不会去争夺资源。就是勾入进,我们就不会去争夺这个资源,如果你这个函数不释放的话。高中生就不会去争夺资源啊?当然这个场景下只是在测试的时候遇到正式场景下,就不会出现中断或者阻塞的情况,就是我们刚才说这种情况是不存在的,刚才情况我们一般都是在这里面处理完之后,我会在。
24:03
网络层也就是在这里面先不给大家说啊,会在这里面做一个操作。在这个里面我们会做一个。这相当于一个解析啊,这有一个消息的一个解析,先做消息的一个什么消息的一个序列化。虚拟化操作。序列化完之后呢,我们这儿呢去。去做go root一个函数啊FUC可以了,就是大家说一下,大家可以先不用。不用着急啊,我们后面会给一大步讲解的。OK。那好,我们大家举个例子啊,给大家看一下我们性能这一块。说一下我们。说一下我们那个设置多核,反而一个降低性能是什么样子的。这块呢,我就把这个行代码注释掉,我后面给大家先。说一下。实际我们会用到,因为我们今天要设置多核嘛,对吧,多核的话是在我们服务器用的比较多的。它呢,给大家解释一下用的什么呢?就是我们用一个循环啊这种。
25:04
多少次,1万次是?退出root,那我们给大家看一下。首先我们刚才给大家看了我们这几核的四核的对不对,这个已经没没什么疑问了,就是七中,七中怎么样,我们看一下我们在runtime这块耗时。我们先把这个执行的一个核心数,先不先不要执行核心数啊。核心数的话,我们先默认的话是CPU核心数对吧。我们看一下时间。好,那我们运行一下编译一下。就看一下这个。是怎么影响我们性能的?我们来看一下它执行的时间啊。1万,我刚刚小一点好了。
26:03
然后我们这个。Data会不会挂掉啊?哎,这就尴尬了。稍微等一下。我们不测不测这个这个什么一般好了。我们看我能停下来了。停不下来。等一下吧。他一直去执行来看。是一个channel的操作。相当于。每一个测试100个吧,这块可能对吧。
27:03
已经没响应。本身data IE它的内存的话。占的不是很多,但是它变异器本身就是有的。本身自己自己有一个空间是专门做。嗯,我们数据缓存的可能会直接爆掉。好,我们先暂停一下,刚才执行完啊。好,我们继续啊,我们把那个改小改成150的话,我们看一下呃,四核运行的话是多少毫秒,大家看到没,这是毫秒级别,14:14点多毫秒。那我们看一下,把我们设置成一核的话,我们看一下啊。这是这是我们CPU多核嘛,就是我们默认的是四核嘛,刚才给大家看了。那我们再编一下,诶这编一下。看一下我们。刚才是大家记一点是4.8多毫秒。那我们看一下我们一核的。
28:06
看到没是多少毫秒?这个是。形象。是四点多2.2倍,有的是我们多核,大家看到没有,我们所以说在开发过程中啊,这个CPU的核数呢,因为我们属于计算比,相当于这个是做一个什么计算,大家看一下是个循环的一个。打印的一个数据啊。这个可能我们在实际游戏开发过程中,可能比这要复杂得多,所以说建议大家呢,在我们开发过程当中呢,一定要设置我们一个CPU的一个核数,但是这的话建议大家我们刚才14.8是吧,那么我们这样子,我们大家看一下,我默认是它二倍的时候。会怎么样乘以二。他会是14.8吗?刚才还是变成了七点多,我们看一下。4.8是一样的,比如说。
29:02
为什么乘以二呢?乘以二是给大家说一个情况,也就是让它CPU的话去跑满我们的。跑满我们整个的一个合数,或者你。用它也是可以的,所以说建议大家呢,乘以二或者乘以多个它,因为本身CPU就是四核或者八核的,你乘以二你还是那个核数嘛,对吧,手始终CPU线程数还是那那些。不会变的,所以这块呢,大家不用说像网上说的呀,什么乘以二啊,或者乘以就直接用我们。CPU跑满就可以。好,这块呢,大家一定要注意一点啊。就是说。你不要设置成墨,设置成一核啊,或者你说想想省一个CPU啊,这会儿你看大家给大家演示那个它的例子上就会看到。就算密集型的话来对于我们游戏服务器的话还是影响很大的,十几毫秒。如果一针到一针,一针一针一般是50毫秒左右,50毫秒一针嘛,50毫秒。
30:02
啊看50毫秒一帧一帧20秒一帧20。50毫秒50毫秒左右,20这样一针。一秒20帧嘛,50毫秒之间,那你就想你这个数据影响很大了,所以建议大家呢,这块你建议建议大家CPU核数的话呢。用乘以二或乘以乘以一都是可以的,也就是用我们CPU合数去跑满。但是呢,大家注意一点啊,就勾语言执行CPU核数呢,呃,是为核心的,其实已经呢,已经为我们最大了,也就是说呃,你不加这句呢,其实也是执行我们最大的,但是你加上这句呢,可能更能充分利用一下我们CP吧。好吧,就说到这里,比如这节课大家说的这个问题呢,大家一定要注意一点,也就是说在我们实游戏实际开发过程中呢,这一点的话,大家一定要最好去设置一下,如果你不设置的话,比如我们就刚才给大家说那个我们改成一和一。你可能在不同的系统,你在测试环境中,你用一核去跑,或者用低于一核去跑,低于我们C核去跑的时候,就是会出现问题啊。
31:06
就会出现你计算比较慢的情况。好,这节课呢,其实就给大家讲完了,给大家讲的主要是一个HTTP服务器的一个建立,这比较简单,HTP建立是我们为下节课我so的一个操作做做那个铺垫,同时给大家讲了一下我们。为什么要设置一个CPU的核数?大家刚才讲那个例子大家知道了吧?对比一下。你默认的话是一核两核三核,和你满CPU跑是不一样的。好,我们今天就到这里,我们就呃,下节课再见吧。
我来说两句