值得注意的是基于安全性考虑,浏览器标准未提供UDP收发能力,QUIC协议也只在chrome获得了支持,WebRTC也还不是浏览器事实标准且协议初始目的是用于实现点对点的音视频通讯,协议内容过于庞杂不容易提炼应用于游戏开发中,于是现阶段H5游戏还只能采用HTTP或Websocket方式通信。
通信协议肯定后,随后要考虑的即是游戏对象的序列化,序列化主要有基于文本、基于二进制两种,其优劣以下表所示。在开发过程当中通常会先采用文本序列化方式,便于先后端开发联调,在游戏正式上线前切换至二进制序列化方式以减小传输流量、提高编解码效率。
至于数据安全性问题,为了保护敏感数据安全开发者能够选择安全的https或WSS通信协议,而对于直接基于TCP协议通信,可采用先用RSA协商加密秘钥,而后使用对称加密方式将数据加密后发送。
经过以上分析,对于游戏协议类型的选择咱们给出有如下准则:
一、弱联网类游戏:诸如休闲、卡牌类游戏可直接HTTP协议,对安全性有要求的话就使用HTTPS;
二、实时性,交互性要求较高:这类游戏通常须要保持长链接,优先选择标准的ws协议(同时使用二进制序列化方式),如考虑安全性可以使用wss协议。而对于提供socket接口的native平台也可以使用TCP协议,同时对数据作对称加密加强安全性;
三、实时性要求极高:不只须要和服务器保持长链接,且延迟和网络抖动都要求极高(如FPS,赛车类游戏),可以使用基于UDP的实现流传输协议如QUIC,KCP等。
二、并发模型
为了处理来自客户端的并发请求,服务端有4种常见的并发模型。
2.1进程
进程是最先采用的并发模型,进程做为操做资源分配、调度的单位,拥有独立的运行空间。进程并发模型中每一个请求由独立的进程来处理,进程一次只能处理一个请求,该模型最大的优势就是简单。若是处理请求的进程因为系统调用而阻塞或进程的时间片用完,抢占式的进程调度器就会暂停旧进程执行,调度执行新的进程,这个过程涉及大开销的上下文切换,进程并发模型的缺点是比较低效。最典型的采用进程模型的服务有Apache。
2.2线程
线程并发模型是进程模型的改进,线程从属于进程,是系统更小粒度的执行调度单元。不一样请求可由进程内多个并发执行的线程来处理,这些线程由操做系统内核自动调度。线程相对进程的主要优点在于,调度上下文切换开销更小,但因为多个线程共享地址空间,须要额外的线程间互斥、同步机制来保证程序性正确性。典型的采用线程模型的服务有Tomcat。
2.3 IO多路复用
利用操做系统提供的epoll等IO多路复用机制,能同时监控多个链接上读、写事件, IO多路复用也称事件驱动模型,网络程序执行逻辑可抽象为事件驱动的状态机。 IO多路复用避免了读写阻塞,减小了上下文切换,提高了CPU利用率和系统吞吐率。但IO多路复用它将本来“同步”、线性的处理逻辑变成事件驱动的状态机,处理逻辑分散于大量的事件回调函数。这种异步、非线性的模型,极大地增长了编程难度,如nodeJs的常见的回调地狱问题。典型的采用IO复用模型的服务有Nginx,netty。
2.4 协程
协程也称为轻量级线程,是一种协同的、非抢占式的多任务并发模型。 协程运行在用户空间,当遇到阻塞或特定入口时,经过显式调用切换方法主动让出CPU,由任务调度器选取另外一个协程执行。
协程切换只是简单地改变执行函数栈,不涉及内核态与用户态转化,也涉及上下文切换,开销远小于进程/线程切换。协程的概念虽早已提出,随着近些年年愈来愈多的语言(go、 Haskell)内置对协程支持才被开发者所熟知,协程极大的优化了开发者编程体验,在同步、顺序编程风格能快速实现程序逻辑,还拥有IO多路复用异步编程的性能。典型的采用协程模型的服务有openresty(Lua), gevent(Python), golang。
以上总结了目前4种经常使用的并发模型,它们在工做原理、运行效率、编程难度等方面有显著区别,各自有适用场景,在实际使用时应该根据需求仔细评估。在实际开发过程当中若是没有可复用的现成网络组件或历史包袱咱们建议使用协程并发模式开发网络接入层服务。
转自:http://gad.qq.com/article/detail/270717