Erlang游戏开发-协议

选择什么协议?

协议包含通讯协议和数据格式.

通讯协议

通讯协议目前常用的是:HTTP 和TCP .其有各自的特点根据游戏的特点而进行选择.

HTTP

HTTP比较成熟,使用极其广泛.具有丰富的基础软件和工具.
对于简单的social game可以使用HTTP作为通讯协议.
这类游戏对实时性要求不是很高,使用HTTP也很容易做到性能扩展,可以较好的满足需求.
如果游戏前端使用HTML+js开发,那么只能使用HTTP了,需要较好的交互性和实时性时,只能
使用HTTP长轮询来实现了.如果前端使用flash开发,游戏交互复杂,实时性要求高,那么HTTP
便不合适了.

TCP

HTTP是高级的应用协议,而TCP便是比较基础的协议了.HTTP也是基于TCP实现.
对于一些web game,基本上采用TCP.其并发量不大(单服web game通常在线千人左右),而
实时性要求很高,尤其是ARPG游戏.因此TCP是不二选择.其前端大多使用flash实现(因为
HTML5之前,html+js无法创建TCP socket).至于非80,非443端口的防火墙问题,貌似现在
的网络环境下可以忽略.

数据格式

文本格式,比如xml,json或自定义均可作为传输的数据格式,文本格式最大的好处是可读,
便于调试,缺点是数据量比较大,冗余信息太多.(当然可以通过压缩来弥补).因此在web
game中很少使用文本作为数据传输格式.

除却文本就是二进制协议了.二进制协议也分多种:protobuf,thrift等通用二进制传输协议和
自定义二进制格式.使用protobuf和thrift的好处是通用性,多种语言均支持,再一个规模比较
大,使用多种开发语言的环境中比较合适.作为web game,通常是一个工作室负责一款产品,
client和server使用的技术和语言相对确定,因此这些通用二进制传输协议就不是最好的选择,
同时,其因为通用,也导致了一些性能下降.

目前大部分游戏是采用自定义二进制协议,基本结构为:头部几个字节表示数据体长度,随后为
数据体.在数据体中,可以划分出几个字节(如2个)表示某种消息.我们会为每种消息都定义数据
格式. 其大致的样子如下: [2字节数据长度][2字节消息类型,具体的消息体].

Erlang中如何处理?

再Erlang中实现这样的协议非常简单, 设置inet:setopts/2的  packet 选项为2,便可支持我们上面
的协议.Erlang自动会首先获取2个字节,作为长度,随后继续接受数据,知道这个包接收完成,
省去了我们自己处理解包,粘包的痛苦 :)(注意2个自己使用无符号的big-endian编码方式).
有了数据体,接下来需要处理2个字节的消息类型,Erlang还提供了一个贴心的选项:{header , size}(注意这个选项只有在socket设置binary选项的时候有效).再这里我们设置{header, 2},这样我们收到的数据体,不是一整块,而是这样:[Byte1, Byte2 | Binary],Byte1,Byte2是Erlang为我们截取出的数据体的头2个字节. 对于熟悉Erlang的朋友,我提一个问题:
这个数据是格式规则的列表么?答案是No,这个列表是一个"畸形"的列表,因为其最后一个元素不是列表.有些绕远了... :(

还有,在Erlang中TCP,拥有一个active 选项,其取值为:true, false, once.看过书的都明白,其是用来控制TCP数据的接收方式.通过使用 inet:setopts(Sock, [{active, once}]),我们可以让数据乖乖的听话,主动发给我们一个数据,然后变不主动,我们处理完这个消息后,然后在设置active once,其继续再发给我们一个数据. 这样的好处是,不会因为{active, true},给我们发送了大量的数据,导致我们应接不暇.也不会让我们每次都手动 gen_tcp:recv/2数据,那么累人.

游戏中协议的消息类型达上百中,这个过程如果手工编码会非常累,应该在开始的时候,再确定好协议格式后,就书写脚本完成协议编解码的自动生成,一劳永逸!大大减少调试出错的可能.协议修改后,通过一个命令就可以重新生成代码.非常happy.(有的团队,更加geek,直接使用erlang:term_to_binary作为二进制协议,由flash端进行erlang term的解析,非常强大).

最后就是要动手,首先把网络和协议搞定,游戏之路就开始了 :)

Erlang游戏开发-协议的更多相关文章

  1. erlang游戏开发tcp

    之前在开发游戏的时候我们采用smartfoxserver这个java开发的游戏引擎,这个引擎在开发回合制游戏方面速度还是不错的.但是面对客户日益增长的需求还是有些力不从心.比如集群,比如灾备,热切换, ...

  2. erlang 游戏服务器开发

    http://blog.csdn.net/slmeng2002/article/details/5532771 最近关注erlang游戏服务器开发  erlang大牛写的游戏服务器值得参考 介绍本文以 ...

  3. Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

    一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...

  4. 优秀工具推荐:两款很棒的 HTML5 游戏开发工具

    HTML5 众多强大特性让我们不需要多么高深技术就能创建好玩的网页游戏,同时证明了开放的 Web 技术能与任何其他在游戏开发中使用的技术竞争.正如标题所说,这篇文章推荐的几款很棒 HTML5 游戏开发 ...

  5. [置顶] mmog游戏开发之业务篇

    这周不是很忙,因为我们的游戏开发了近一年,由于公司的业务调整,在游戏开第二服的时候,老板果断的把项目停到了. 感觉超级的不爽啊.因为这个游戏项目像我的孩子一样和我一样成长,里边的大概的业务逻辑都是偶实 ...

  6. Erlang游戏服设计总结

    这主要是一年多来,个人从事Erlang游戏服开发中对一些事情的思考. 想到哪说到哪,没有条理可言. 欢迎讨论. 通常Erlang游戏服务的设计涉及到的东东包括如下: 任务系统 活动系统 公会系统 玩法 ...

  7. C++游戏开发需要阅读的书籍

    如果要自学游戏程序开发的话,可以看看下面的,呵呵. 游戏开发资料(PDF书都是中文版的,非英文,很多是本人自己扫描制作,从未网上发布过,所以独家啦):  1.Gamebryo 2.2游戏引擎(盛大.腾 ...

  8. 转: Orz是一个基于Ogre思想的游戏开发架构

    Orz是一个基于Ogre思想的游戏开发架构,好的结构可以带来更多的功能.Orz和其他的商业以及非商业游戏开发架构不同.Orz更专著于开发者的感受,简化开发者工作.Orz可以用于集成其他Ogre3D之外 ...

  9. Unity3D手机游戏开发

    <Unity3D手机游戏开发> 基本信息 作者: 金玺曾 出版社:清华大学出版社 ISBN:9787302325550 上架时间:2013-8-7 出版日期:2013 年8月 开本:16开 ...

随机推荐

  1. express,中间件(body-parser),req.body获取不到参数(含postman发请求的方法)

    问题描述: 最近在做毕设,express 里边的中间件(body-parser)失效,req.body获取不到任何值,req.query能获取到值.一开始加body-parser中间件是有用的,直到昨 ...

  2. JS学习笔记 - 自定义右键菜单、文本框只能输入数字

    <script> // 事件总共有2个部分, //1.点击鼠标右键的表现 oncontextmenu 2.点击鼠标左键的表现(即普通点击onclick) // 点击右键,div位置定位到鼠 ...

  3. linux下设置密码复杂度限制,怎么设置?

    在linux,设置密码复杂度的方法有几个1. 一个是在/etc/login.defs文件,里面几个选项PASS_MAX_DAYS 90 #密码最长过期天数PASS_MIN_DAYS 80 #密码最小过 ...

  4. 嵌入式Qt-4.8.6显示中文并且改变字体大小和应用自己制作的字体库

    问题: QT4.8.6在移植到开发板上的时候,中文支持是必不可少的,如何让QT支持中文,如何制作QT支持的字体文件,如何使QT UI编辑器中的字号与开发板中的字号一致. 详解: 1>如何让QT支 ...

  5. UVA 10635 - Prince and Princess LCS转化为LIS

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  6. ios越狱开发

    theos/Logos常用命令 %hook 用的最多,意思是钩住一个类. %hook SpringBoard %end %new (v@:) 新建方法 v是返回值@代表参数名 %new(v@:@i) ...

  7. 【UIL框架】Universal-Image-Loader全然解析(一)之介绍与使用具体解释

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50439814 本文出自:[江清清的博客] (一).前言: [好消息] ...

  8. 【26.83%】【Codeforces Round #380C】Road to Cinema

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. 神经网络 vs 大脑

    海马区域(负责记忆的关键区域) 0. 常见概念 神经递质:neurotransmitter 在突触传递中是担当"信使"的特定化学物质.简称递质. 重要的神经递质有:乙酰胆碱: 1. ...

  10. java之 ------ 枚举类型

    枚举 一.枚举类型具体说明 简单的说.Enum一般用来表示一组同样类型的常量. 如性别.日期.月份.颜色等.对这些属性用常量的优点是显而易见的,不仅能够保证单例,且在比較的时候能够用"==& ...