WebGame开发总结

WebGame开发总结项目基本情况:  服务器端采用c++和c#混合开发,网络层采用c++开发,业务逻辑用c#开发。客户端采用silverlight。数据库采用mysql。GM工具用Asp.net,GM工具盒服务器通讯用wcf,基本把微软的东西都用遍了。  服务器端在开始的时候,使用了某位同事之前开发的一款服务器端引擎,改引擎曾经开源但现在基本不再更新。引擎地址:http://mmorpg.codeplex.com/  这款引擎在使用上只满足了部分需求,再加上原作者又跳槽,引擎基本是我在维护和改进,不过基本上都往里面

大家好,又见面了,我是你们的朋友全栈君。

不知不觉我们的项目开发有2年了,这两年来走了很多弯路,也收获了很多,今天在这里做一个总结。

项目基本情况:

  服务器端采用c++和c#混合开发,网络层采用c++开发,业务逻辑用c#开发。客户端采用silverlight。数据库采用mysql。GM工具用Asp.net,GM工具盒服务器通讯用wcf,基本把微软的东西都用遍了。

  服务器端在开始的时候,使用了某位同事之前开发的一款服务器端引擎,改引擎曾经开源但现在基本不再更新。引擎地址:http://mmorpg.codeplex.com/

  这款引擎在使用上只满足了部分需求,再加上原作者又跳槽,引擎基本是我在维护和改进,不过基本上都往里面加东西,改动地方不多(主要是修改小bug)。引擎的网络层采用C++开发,原先的代码有些问题,后来公司同事用c++重写了个网络层,效率上还不错,测试下来每秒能发送30w+个数据包。如果有同学想用上面说的引擎,需要自己对网络层进行改造。引擎除了网络层外,其它的部分都还ok,可以放心使用。

  客户端用silverlight是整个项目的一个大败笔,因为,微软现在已经放弃它了。虽然sl在配合我们的服务器开发很方便,但玩家和运营商的接受度还是比较低,所以,你懂的。

 研发总结:

  1.账户和玩家id,要在所有服务器里全局唯一。这点,之前在看一些其他网友的总结里有说过,但是当时真的没认为有多重要,直接用数据库的自增也可以。等游戏真正上线后才发现,这对游戏后面的运营,合服都产生了重大影响。最直接的影响,就是每次合服都需要重置玩家的id。合服需要修改的和账号id关联地方就数不清了,所以,在这里还是要和各位强调,账户的唯一id对游戏运营非常重要。

  2.游戏逻辑的脚本化或者动态更新能力。如果游戏做不到脚本化,那么,至少要利用.net的特性,实现dll的动态加载和更新。运营时不停服更新是很重要的功能,因为每次意外停服都有可能会造成5%的玩家流失。而在运营中碰上的bug,基本上是代码的逻辑错误或者数据配置错误,有动态更新功能,就能不停服更新服务器,修正这个bug。真正的因为底层崩溃的bug导致游戏崩溃的,基本没发生过(底层代码还是很稳定的^_^)。

  3.游戏死锁状态下脱离死锁的功能。虽然我们只是在偶然几次特殊情况下碰上,但是如果当时有脱离死锁功能(把当前任务强制结束,继续执行后面的任务),我们就不用重启服务器了。

  4.给策划的数据配置文件,要二维表结构,不要多维表结构。虽然xml可以表示多维表和树形关系,反序列化后可以给程序直接使用。但是,结构层次一多,策划在通过excel转xml时就容易发生问题,同时也不利于策划配置数据。所以,在定义配置文件时二维表比多维表要好。

  5.数据记录不可或缺。日志不仅仅指错误日志,还包含游戏里业务逻辑产生的数据。游戏逻辑需要记录的数据由策划定。作为程序我们也记录一些数据,特别需要关注的是每个任务执行的耗时,这个对今后的性能优化很有帮助。(注意,性能优化不仅仅只是用性能测试工具来看看那个函数耗时那么简单。因为只有真正上线后,玩家玩游戏时才能找到真正热点任务。)

  6.一定要挡住策划设计的带复杂玩法的系统。数据结构越复杂,规则越多,业务逻辑就容易混乱,混乱了,bug就产生了。所以,简化玩法对程序和玩家也有好处。

  7.敏捷开发。敏捷开发里的规则就算不能全用,下面的几点最好还是要有:单元测试,每日构建,以周为单位的迭代开发,故事(任务)墙。

运营总结:

  1.服务器的环境依赖尽可能少。在一台空白的windows2003上,我们配置服务器之前,需要上传200M左右的软件并进行安装,导致重新配置一台新服务器的时间不少于3小时,时间浪费严重。

  2.游戏的配置项要尽可能的少。这个配置是指数据库,ip,端口等,每个服务器都会不一样的配置。因为配置项分散在多个文件,导致文件安装到位后,还需要仔细的修改和检查这些文件,也浪费了不必要的时间。

  3.合适自己的服务器更新方法。一开始我们用远程登录到服务器,然后执行更新批处理的方法进行更新。但当服务器变多(>8台)时,这个流程就会变慢,也容易出错。最后用ssh执行脚本的方法对服务器进行批量更新。

  4.服务器的监控工具。监控的目的是防患于未然,例如,硬盘不足,cpu和内存异常变高,这个都是出故障的前兆。我们的游戏运行时会产生大量的日志,常常会因为配置关系,没有及时处理这些日志数据从而导致日志被撑满硬盘,游戏被迫停服。大家不要以为现在硬盘很便宜,2T的硬盘还不到600块,但是运营商给的硬盘通常是73G或者140G。

 

最后

  用.net技术开发游戏服务器的项目还是很少,虽然偶尔有几个公司用,但是和c++以及java还是没法比。中间原因很多,就不能细说。这里公布几个群,欢迎大家入群交流:

  C#游戏服务器交流  136485198  –群里面有有一个c#的网络引擎的高手

  C#游戏开发     223604735

  C#游戏服务器交流  279489850  –群主用c#实现了一个《热血传奇》的服务器

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133737.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • linux 编译汇编,linux下的汇编教程

    linux 编译汇编,linux下的汇编教程linux下的汇编教程第一部分Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.gnu.org)上下载有关规范。一.Linux汇编行结构任何汇编行都是如下结构…

    2022年6月22日
  • git安装教程 windows10_灯保姆安装公司

    git安装教程 windows10_灯保姆安装公司git安装与使用的保姆级教程,图文齐全,一步一步教,小白看了都说好~,安装、使用、创建仓库、同步代码、检查代码、创建分支、合并主分支等等…

    2022年9月3日
  • Matlab画图 线条的颜色、宽度等相关设置

    Matlab画图 线条的颜色、宽度等相关设置线条的属性有:Color——颜色、LineWidth——线条宽度、LineStyle——线型、LineJoin——线条边角的样式、AlignVertexCenters——锐化垂直线和水平线线条属性的默认值为([0,0,0],’-‘,’0.5′,’round’,’off’)颜色、线型、一、线条颜色二、线条宽度线条宽度的默认值为0.5,线条宽度只能指定正值。三、线条类型实例:plot(t…

    2022年5月29日
  • python学习笔记——hashlib模块「建议收藏」

    python学习笔记——hashlib模块「建议收藏」上篇:https://blog.csdn.net/qq_42489308/article/details/89813895hashlibHash,译做“散列”,也有直接音译为“哈希”的。把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值。该算法就是哈希函数,也称摘要函数。MD5是最常见的摘要算法,速度很快,生成结果是固定的16字节,通常用一个32…

    2022年6月11日
  • Hexo-Matery主题细致美化

    Hexo-Matery主题细致美化Hexo-Matery主题美化在一番瞎改js代码后,终于无法忍受next主题,于是愤然投入Matery大家庭,结果证明,香!下面是我记录的配置Matery主题的流程,仅供后来的师傅们参考。大家可以来我Hexo博客主页看看具体效果我的小站下载安装Matery主题首先在hexo官网主题里面搜索Matery主题点击进入作者大大的github,然后下载master分支的最新稳定版的代码,解压缩后将hexo-theme-matery的文件夹重命名为matery,复制到Hexo的theme

    2022年5月19日
  • 操作系统实验:银行家算法C语言实现

    操作系统实验:银行家算法C语言实现银行家算法C语言实现#include<stdio.h>#include<stdlib.h>#defineok1#definetrue1#definefalse0intclaim[100][100]={0};//各个进程需要的最大资源数量intalloc[100][100]={0};//各个进程已分配的资源数量intneed[100][100]={0};//各个进程还需要的资源数量intresource[100]={

    2022年6月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号