使用Go 语言开发大型mmorpg游戏 MMORPG 游戏服务器怎么样

使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?
和C Socket服务器比起来有什么优劣?可行性怎么样?
按投票排序
看到Golang我就进来了, 我们用的是Golang 1.4版本我们开发的不是MMORPG, 但是规模不小, 纯Golang开发. 从处理客户端连接, MySQL处理到跨服, 平台SDK对接都是使用Golang开发的之前我的C++服务器框架也是完善的, 但和Golang比起来, 总是有一些问题, 比如说:1. 总是感觉C++写出来的服务器要结实一些, 因为有强大的IDE(我们是在Windows开发Linux下运行), 强大的调试器(VS). Golang虽然没有这些, 但LiteIDE本身已经足够强大,没有之一2. Golang性能调优很是方便, 性能, 内存和阻塞, 3个pdf生成节点图, 几下就能找出问题所在. C++在这点上必须用专业第三方收费工具以及自己多年的经验来分析, 很是麻烦3. Golang任何错误都可以捕捉, 跨平台运行, 尤其是Linux, 比C++稳定的多. 不用担心哪天挂掉4. Golang的Socket, 让你能想起当年用C语言的阻塞Socket时代. 可惜操作系统的线程不能跟goroutine同日而语5. Golang语言简单, 任何语言招来, 2~3天开始生产代码, 很简单, 用的人也舒心6. Golang的语言特性很好, 没有OO的冗余, 只有复合+接口的简洁. 用习惯后, 都不敢去用C#的OO, 怕继承变化需要重构7. Golang 1.4比前面版本好很多, gc基本没啥大问题了. 只是自举的编译器编译速度下降了不少. 但问题不大8. Golang写服务器, 因为阻塞+同步逻辑, 所以还是得考虑各种线程同步问题. 该加锁还是要加锁, 而不是一味都用channel+goroutine来实现. 逼近channel本身是由多个锁来实现的.9. Golang写tcp短连接不知道比C++简单上百倍吧, 比boost.asio这些封装库也简单个10来倍http连接就更简单了, 啥都给你处理了, 只管收消息就是了10. 至今为止, 坑就1个, interface{} 简直是双刃剑. 因为没泛型, 所以用interface{}等同于void*. 如果用interface{}做了map的key, 恭喜你, 迟早有一天你会调的死去活来. 还更别说interface{}与nil, 一把泪啊11. 看有些写法喜欢在Golang服务器里嵌入脚本. 我们的服务器也嵌入有otto的JavaScript引擎, 但只用来做服务器配置, 方便部署. 但是没有把JavaScript拿来做逻辑. 毕竟考虑各种线程安全问题. Lua最终我们还是放弃了, 没有C++那些绑定库, 纯api编写, 都不知道是在写逻辑还是在封api.12. 除了服务器以外, 我们还用Golang编写机器人, 电子表格数据导出等. 13. Golang开发效率很高, 一般大的游戏功能, 2*2人一周3~4个整完. 这换C++时代, 大概也就1~2个还写不完14. 部署太方便了! 编译出来的可执行文件都是零依赖. 直接丢到目标机器就可以运行, 没有虚拟机之类的东西打个广告, 各种golang开发笔记, 参考
因为我自己本身不是做mmorpg的,这里只是给出我认识的一些人给我的反馈信息。1. 我认识的几个人都有用在游戏开发中,手游、页游都有,所以不能说没有成功案例2. golang主要存在的问题是GC问题,但是如果你的应用访问量没有上千万的话,达达分享的如何有效的控制GC非常宝贵的经验,而且下一版本Go1.3基本上能够解决Go的GC问题。3. golang的并发控制是最大的特点,能够很容易就实现高并发4. 目前golang发布的节奏是每半年一个版本,而且基本都是性能的提升,就目前的性能而言,你的应用已经足够用了。5. 开发工具LiteIDE写代码就非常棒,写Go代码足够足够了6. Go方面的资料现在还是挺多的吧,而且你遇到问题去golang-nuts去问,都会很快得到答复7. 而且对于Go在Google内部使用的情况来看,网络这一块的包是非常稳定和可靠的,用来开发游戏很合适啊
我们公司正在用Go开发页游。上线运行有一段时间了,效果还算满意。用Go开发大型mmorpg服务端不会有问题的,如果掉坑里肯定不会是语言的问题。唯一比较可能掉进去的坑就只有GC,其实很容易预防和调整的,具体细节可以看我博客分享的文章。但是技术选型不只是选语言,如果当时我手头有一套性能满意,开发效率OK,人员补给不会有问题的技术方案,不管是什么语言的,我肯定不会放弃它而选择冒险的。我去年项目立项时选择Go是有以下一些考虑的:1. 前一个项目用Erlang开发的,活动时间一到,密集运算CPU就受不了,这点很不满意2. 项目过程中出现过补人难的情况,听过Erlang并愿意转Erlang的人少,招来了培训到加入开发又要一段时间3. 因为前两点,所以新项目想找一个解决性能问题又解决人员问题的技术方案4. 我自身没有C/C++项目经验,只会点皮毛语法,短时间要上手并拿出可用的框架不现实5. C/C++开发人员我们这也不好招6. 那会正好Go 1.0即将发布,我估摸着项目上线后Go还会更完善,有点赌一把的意思7. 我给自己设想的最坏情况是Go不行的时候可以用CGO补救,当时考虑比较多的是性能,但实际上性能没问题,倒是用CGO做了GC优化,补救了自己最初设计上的不合理。8. Go的语法元素非常之少,并且是类C的命令式语音,又有Google这个开发人员心中形象完美的亲爹,人员补充上应该比Erlang容易对了,我最近做了个Go语言的V8引擎绑定,可以用来做游戏逻辑脚步啥的。欢迎各路勇士踊跃跳坑:
想必到今天,用 Golang 开发大型 MMORPG 游戏服务器的应该案例鲜见。但在手游和页游上,Golang 到挺活跃的。我是 C++ 转 Golang,说说感受。执行效率。Golang 是编译型的,给人的感觉是性能可靠。开发效率。Golang 提供了丰富的反射支持,用在框架开发上真是得心应手,甩开 C++ 几条街。由于较好的反射支持,能够写出更加简洁和易用的接口,对于上层开发效率有比较明显的推动作用。再说,Golang 语言本身很简单,不但是入门成本低,开发中需要考虑的语言本身的问题也少。不崩溃。因为所有错误都可以捕获,所以只要不出现把内存耗尽、死循环等致命问题,大多数情况,在一个精心设计的框架下,服务器稳定性能够有很大的保障。Goroutine + 同步阻塞。此模式能够解决 C++ 服务器中存在的极少的复杂的异步调用的问题。对人的要求低。C++ 对开发人员素质要求过高。相同素质的人,用 Golang 能写出很漂亮的东西。Golang 本身是有那么一点“特殊”的语言,没有经过细致的思考(包括业务的思考,语言本身的思考),Golang 写不出好框架,甚至让你掉坑。
看完答案后,纠正一些常见错误,曲线救国回答一下题主;1.为什么golang的开发效率高?golang是一编译型的强类型语言,它在开发上的高效率主要来自于后发优势,不用考虑旧有恶心的历史,又有一个较高的工程视角。良好的避免了程序员因为“ { 需不需要独占一行 ”这种革命问题打架,也解决了一部分趁编译时间找产品妹妹搭讪的阶级敌人。它有自己的包管理机制,工具链成熟,从开发、调试到发布都很简单方便;有反向接口、defer、coroutine等大量的syntactic sugar;编译速度快,因为是强类型语言又有gc,只要通过编译,非业务毛病就很少了;它在语法级别上支持了goroutine,这是大家说到最多的内容,这里重点提一下。首先,coroutine并不稀罕,语言并不能超越硬件、操作系统实现神乎其神的功能。golang可以做到事情,其他语言也可以做到,譬如c++,在boost库里面自己就有的coroutine实现(当然用起来跟其他boost库一样恶心)。golang做的事情,是把这一套东西的使用过程简化了,并且提供了一套channel的通信模式,使得程序员可以忽略诸如死锁等问题。goroutine的目的是描述并发编程模型。并发与并行不同,它并不需要多核的硬件支持,它不是一种物理运行状态,而是一种程序逻辑流程。它的主要目的不是利用多核提高运行效率,而是提供一种更容易理解、不容易出错的语言来描述问题。实际上golang默认就是运行在单OS进程上面的,通过指定环境变量GOMAXPROCS才能转身跑在多OS进程上面。有人提到了网易的pomelo,开源本来是一件很不错的事情,但是基于自己对callback hell的偏见,我一直持有这种态度:敢用nodejs写大规模游戏服务器的人,都是真正的勇士 : ) 。2、Erlang与Golang的coroutine有啥区别,coroutine是啥?coroutine本质上是语言开发者自己实现的、处于user space内的线程,无论是erlang、还是golang都是这样。需要解决没有时钟中断;碰着阻塞式i\o,整个进程都会被操作系统主动挂起;需要自己拥有调度控制能力(放在并行环境下面还是挺麻烦的一件事)等等问题。那为啥要废老大的劲自己做一套线程放user space里面呢?并发是服务器语言必须要解决的问题;system space的进程还有线程调度都太慢了、占用的空间也太大了。把线程放到user space的可以避免了陷入system call进行上下文切换以及高速缓冲更新,线程本身以及切换等操作可以做得非常的轻量。这也就是golang这类语言反复提及的超高并发能力,分分钟给你开上几千个线程不费力。不同的是,golang的并发调度在i/o等易发阻塞的时候才会发生,一般是内封在库函数内;erlang则更夸张,对每个coroutine维持一个计数器,常用语句都会导致这个计数器进行reduction,一旦到点,立即切换调度函数。中断介入程度的不同,导致erlang看上去拥有了preemptive scheduling的能力,而golang则是cooperative shceduling的。golang一旦写出纯计算死循环,进程内所有会话必死无疑;要有大计算量少i\o的函数还得自己主动叫runtime.Sched()来进行调度切换。3、golang的运行效率怎么样?我是相当反感所谓的ping\pong式benchmark,运行效率需要放到具体的工作环境下面考虑。首先,它再快也是快不过c的,毕竟底下做了那么多工作,又有调度,又有gc什么的。那为什么在那些benchmark里面,golang、nodejs、erlang的响应效率看上去那么优秀呢,响应快,并发强?并发能力强的原因上面已经提到了,响应快是因为大量非阻塞式i\o操作出现的原因。这一点c也可以做到,并且能力更强,但是得多写不少优质代码。然后,针对游戏服务器这种高实时性的运行环境,GC所造成的跳帧问题确实比较麻烦,前面的大神
有比较详细的论述和缓解方案,就不累述了 。随着golang的持续开发,相信应该会有非常大的改进。一是屏蔽内存操作是现代语言的大势所趋,它肯定是需要被实现的;二是GC算法已经相当的成熟,效率勉勉强强过得去;三是可以通过incremental的操作来均摊cpu消耗。用这一点点效率损失换取一个更高的生产能力是不是值得呢?我觉得是值得的,硬件已经很便宜了,人生苦短,让自己的生活更轻松一点吧: )。4、基于以上的论述,我认为采用go进行小范围的MMORPG开发是可行的。
我的看法是:未来肯定会成为标配,也就是 mmorpg 最为广泛接受的方案。至于:1. 你信不信2. 你应该什么时候介入这个别人帮不了你。
下面是我在准备写一个新的游服时技术选型的比较,最后我选了C#;C#的优点:1.有强大IDE,无论编写还是调试都非常容易,可以节省大量时间。2.有大量资料可查3.不会有Runtime层的内存泄漏。4.有成功先例,说明用起来没问题。5.运行速度快。6.我非常熟悉。7.代码框架可以参考传统游戏服务器的实现方式。缺点:1. 相对go,布署比较麻烦。2. linux上得用mono,性能有下降。3. 非开源(相对GO,其实从实用角度来说,不是什么问题)。golang的优点:1.原生高并发2.布署方便golang的缺点1.没有强大的IDE,开发和调试都不方便(至少是没有用VS那么方便)2.没有大量资料。3.有runtime内存泄漏问题。4.市面上没听说过有golang开发的游戏服务器,没先例,无人研证过可不可用,有风险。5.运行速度并不比c#有优势。6.我没c#那么熟悉7.代码框架虽然也可以参考传统游戏服务器的实现方式,但这样就失去了高并发和go程的优势,所以这块势必要重新思考,增加了风险。
如果跟C语言比,大部分脚本都胜出啊。Go, Node.js, Python ......网易弄过一个Node.js的开源服务器框架。至于IDE, 不重要,做服务器开发很少会要开着IDE调试的。最常用的手段就是打Log. 设置了断点也很难调,多个客户端并发。那种单客户端连接进来就可以重现的bug倒是可以用IDE调,但是这种bug本来就容易解决。用脚本语言,有一个很大的好处是容易做自动测试,可以更好地保证代码质量。--------------------------开发效率当然是脚本高。运行效率,其实更重要的是并发,框架合理的话增加机器就可以直接提高效率增加人数。
可以,但我现在了解到的大部分webgame大多采用c c++ c# 做底层 python lua
js做脚本,直接用c c++ c#(scut开源) python(firefly开源) js(node)(网易开源) go(达达,仙侠道,貌似有用js做脚本)
erlang的也有,但技术选型其实是考虑人员配置和团队成长,不必纠结,而且大部分情况是没得选。补充:刚刚又看到 云风的c+lua框架 大家可以入门也可以直接用。 这个是我目前研究和收集的内容。
大型 MMORPG 游戏服务端,估计以后都很难看到golang的“成功案例”。障碍不在于GC这些,而在于现在大型 MMORPG 只有大公司能搞得动。而大公司一般都已经有大牛,已经有积累了n年的服务端c/c++框架。如过真的有新进入者,需要从头开发服务端框架,那用go几乎是最佳选择。对页游/手游来说,go可以说是天地广阔,大有可为。一个用C++半年抄出一个游戏且时不时会宕机再加3个月才能搞稳定的团队 VS 一个用go三个月抄出一个游戏且从不宕机的团队,嘿嘿......
很多时候回答这类问题大家喜欢用一种特征列举的方式,比如:C有什么什么特征,所以适合,Go有什么什么特征所以不适合。但其实对于实际想获得答案的人这种特征列举并没有想的那么有用,因为你没法判定那个片面那个不片面,那些是偏见,那些是纯主观。所以最简单实用的方法是去确认什么是被证明过的成熟的技术,比如有多少成功的mmorpg用的是这门语言或框架,另一个是看那个社区成熟。毕竟大多时候事业本身并不适合为新技术背书。
优势。开发效率高。劣势 速度相对慢。但对于一般网游来说,应该可以忽略。个人感觉开发效率对大部分团队来说是首要的,因为你能快速出产品比什么都强。服务器效率go比不上c++,但是对大部分人来说肯定也够了。go另外一个劣势就是对大多数程序员来说是一门新语言,需要学习。不像c,java拿来就写。不过这一点可以被开发效率高弥补。
从趋势上看,go以后发展最多的肯定是后端的应用,gc的问题只是暂时的,c++被取代是毫无疑问的。
不建议用xxlang,用脚本,比如lua只提一个工程问题,游戏开发中,很多逻辑前后端公用,怎么处理?别告诉我前端要加个xxlang的编译器。如果你告诉我,需要再xx一次,当我没说。MMORPG大型游戏设计与开发(服务器 AI 逻辑设定和状态结点)-服务器-爱编程
MMORPG大型游戏设计与开发(服务器 AI 逻辑设定和状态结点)
人工智能(AI)中往往都会有这么一个问题,那就是我要做什么?我该怎么做?我需要什么?所以这里所谓的智能就是赋予AI对象的判断力,以及它根据判断得到的相应反应。就好比,你去商店买东西,钱够别人才卖给你,不够不可能卖你,这里就会触发了两种结果,如果你要强买的话,那么店员就可能产生相应的措施了。其实这里的店员,就相当于我们所谓的人工智能,不过店员的反应和动作是根据他自身思考产生的,人工智能也有这个思考的过程,只不过比店员想的少很多。这个思考的过程,也就是逻辑设定与处理的过程,那么什么又是状态结点呢?
逻辑设定(logic)
& 1、内部接口
& &&创建(setup)
& & &&逻辑设定初始化,初始化对应的类型,根据传入的脚本ID中的创建方法。
& &&获得动作(get action)
& & &&根据动作的ID查找对应的动作指针,注意这里的动作列表是逻辑设定对象中的数据。
& &&获得状态(get state)
& & &&根据状态查找对象状态表中对应的状态数据指针。
& &&获得初始化状态(get init state)
& & &&获得初始化设置的状态。
& &&获得脚本ID(get script id)
& & &&获得当前的脚本ID。
& &&调用动作(call action)
& & &&根据角色的对象指针,以及动作处理,调用脚本相应的方法,并返回下一个动作。
& 2、lua接口
& &&创建动作(new action)
& & &&在lua中传入两个参数:动作ID和动作的键(回调),根据这两个参数将动作加入到管理器中。
& &&增加状态(new state)
& & &&从lua中传入一个状态,并加入到状态表中。
& &&设置初始化状态(set init state)
& & &&脚本中传入一个状态,并将该状态设置为初始状态。
& &&注册用户动作(register user action)
& & &&两个参数:动作回调的key,动作回调的方法字符串,并将这两个数据加入到用户动作表中。
状态结点(state)
& 1、内部接口
& &&获得事件回调(get event handler)
& &&输出状态信息(print state info)
& 2、lua接口
& &&处理事件(handle event)
算法(矩阵算法)
&&反螺旋矩阵
#include &stdio.h&
#include &stdint.h&
* 反螺旋矩阵
* 例如:5x5的反螺旋矩阵
---- 作为列序号
&&&&&&&&&&&&&&&&&&&&
* 作为行序号
* 根据行与列,可以将这样的矩阵视作array[5][5]的数组
* 首先我们要知道反螺旋的规则,就是从某一点开始以1开始逆时针方向依次增加1
* 其次我们都知道螺旋,分为一圈圈的,那么一个螺旋就有其圈数,与圆形不同的是矩阵
* 分为4个方向,分别为上、左、下、右(组成一圈的数据)
* 再来从数据递增的方向分析序号的规则
* 左边:行号依次递增为1,列号不变
* 下边:列号依次递增为1,行号不变
* 右边:行号依次递减为1,列号不变
* 上边:列号依次递减为1,行号不变
* 如果定义行号为i,列号为j,圈数为k的话,那么这三个数据在每圈是不是都有相似的规则呢?
* 首先我们需要确定圈数,其与矩阵的大小有关,即如果是NxN的矩阵的话,圈数m=(N + 1) / 2
* 有了圈数,我们才好确定我们需要几次循环来组成每圈的数据
* 我们将最外层的一圈的圈数设置为0,让其循环到最后一圈即k - 1为止
* 假设数据的变量为value,从1开始
* 数据从1开始从最外层一次加1,并依次从左、下、右、上形成圈的数据,到最后一层为止
* 左边的数据规律:行的序号从圈数k开始,依次累加1,列号等于圈数k
for (i = i & n - ++i) array[i][k] = value++;
* 下边的数据规律:列号从圈数k+1开始,循环到小于数据n - k为止,其行数为n - k - 1
for (j = k + 1; j & n - ++j) array[n - k - 1][j] = value++;
* 左边的数据规律:行号从n - k - 2开始,依次循环到不小于k为止,其列数为n - k - 1
for (i = n - k - 2; i &= --i) array[i][n - k - 1] = value++;
* 上边的数据规律:列号从n - k - 2开始,依次循环到k,其行数为k
for (j = n - k - 2; j & --j) array[k][j] = value++;
#define ARRAY_MAX 100 //最大支持的矩阵数
//生成矩阵
void generate_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length);
//打印矩阵
void display_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length);
void generate_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length) {
int32_t i, j,
int32_t value, circle_
value = 1;
int32_t &n =
circle_count = (n + 1) / 2;
for (k = 0; k & circle_ ++k) {
for (i = i & n - ++i) array[i][k] = value++; //left
for (j = k + 1; j & n - ++j) array[n - k - 1][j] = value++; //bottom
for (i = n - k - 2; i &= --i) array[i][n - k - 1] = value++; //right
for (j = n - k - 2; j & --j) array[k][j] = value++; //top
void display_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length) {
int32_t i,
for (i = 0; i & ++i) {
for (j = 0; j & ++j) printf("%4d", array[i][j]);
printf("\n");
int32_t main(int32_t argc, char *argv[]) {
int32_t n = 0;
int32_t array[ARRAY_MAX][ARRAY_MAX];
while (n &= 0 || n & ARRAY_MAX) {
printf("please input a unsigned int number(less than 0 and not above %d): ",
ARRAY_MAX);
scanf("%d", &n);
generate_array(array, n);
printf("the anti spiral array is: \n");
display_array(array, n);
& & result.
&成员招募(长期有效)
& 如果你也对开源知识比较感兴趣,如果也对网络应用或者网络游戏感兴趣,如果你也对该框架感兴趣,你可以加入我们的QQ群()。
& 欢迎大家进群相互交流学习,同时也欢迎各位朋友对该框架供出自己的一份心力。
plain framework 商业版核心成员招募
& 请加入上面的框架QQ群,商业版核心成员的招募资格和形式将以博客或者文档等的形式公布(14年内确认人选)。
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。使用 go 语言开发大型 mmorpg 游戏服务器怎么样_百度知道
使用 go 语言开发大型 mmorpg 游戏服务器怎么样
提问者采纳
我肯定不会放弃它而选择冒险的,如果掉坑里肯定不会是语言的问题,开发效率OK,如果当时我手头有一套性能满意,人员补给不会有问题的技术方案,具体细节可以看我博客分享的文章。  唯一比较可能掉进去的坑就只有GC,其实很容易预防和调整的  用Go开发大型mmorpg服务端不会有问题的,不管是什么语言的。  但是技术选型不只是选语言
其他类似问题
为您推荐:
游戏服务器的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 godaddy服务器怎么样 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信