首先要知道游戏类型是什么,然后知道承载人数是多少,以及开发周期多少。需要根据这些来决定游戏架构和技术选型。

网络和数据协议

网络传输tcp VS udp

tcp可靠保序,而udp则不是,但是吞吐量会大很多,一般来说tcp在端游时代是比较常用的一个选择,但是手游时代并不是很适合,特别是一些竞技类游戏对延迟比较敏感的,而tcp设计的初衷是‘全局最优’的,所以有了指数退避重传,慢启动等策略,竞技类游戏往往采用基于udp的一些可靠协议来实现,比如kcp等。其他对延迟不敏感的游戏采用tcp还是个比较通用的选择。

IO模型

游戏服务器采用的多路复用技术不同系统提供的策略不同,select,epoll,kqueue,iocp等。如果需要支持大量连接的地方,比如游戏的gate服务器往往可以采用epoll,kqueue,iocp等等,如果需要支持不多连接的服务器,比如不是直连客户端的服务器,也可以使用select和poll等,但是大部分情况下网络库做成通用的形式,很少提供不同服务的服务器进程采用不同的io模型。

数据协议

网络传输过程中采用tcp这种流式协议的方式,因为有mtu的缘故,数据协议往往通过(长度+协议编号+内容)的方式编码,接收 的时候需要检查数据包的完整性。通过预估协议数量来决定2个还是4个字节长度来表示协议号长度,一般游戏2个字节足够了,协议数量一般不超过1000

pack/unpck

这里需要注意大小端的问题,不过现在一般对于游戏服务器来说一般都是小端的结构,python和lua在struct的pack和unpack中可以指定大小端的。

玩家数据存储

文件存储和数据库存储

数据库的存储是个格式比较固定,但是别的系统很容易连进来使用,方便统计,也方便分shard,而且数据库本身做了LRU这种操作,可以做到比较高效的读取和写入。

文件存储比较容易扩展,灵活,但是别的系统不容易连进来使用,性能相对较 差。比如每个玩家的属性结构 一个文件或者一个bindata的形式,其实现在用mongodb算结合了2者的优点

存储间隔

这个不同游戏实现方式也不同,如果落地时间较长服务器故障后会回档,反正带来大量的序列化的开销以及数据库压力的开销。想做到即时存盘一般都是用类似数据库的策略oplog的形式增量存盘。

gameplay设计

对于gameplay来说,本身就是个大循环,一定频率进行tick,接收来客户端或者其他服务器的rpc,处理逻辑,然后数据落地以及发送数据给客户端或者其他服务器,一般gameplay来说在同一个进程里都是同步的方式去编写,同步的实现大多数是单线程的,或者使用coroutine来实现actor这种模式。大部分游戏交互都是比较多,所以不论service和service之间的交互还是玩家和玩家之间的交互,如果考虑多线程的同步的问题,会非常复杂以及很容易做错,所以一个service内同一个时刻都是在一个线程中执行的。

场景管理

针对mmo或者一些竞技类游戏往往有场景管理的概念,就是游戏AOI,比如一个玩家移动,需要告诉周围所有的玩家,复杂度在n*n,如果减少这个n,就有了AOI算法,比如九宫格,十字链表等,如果刚开服的时候很多人挤到一个主城中,就算采用九宫格和十字链表等AOI等算法,往往同屏内玩家数量还是很大,客户端渲染的单位数量比服务器少一个数量级的,所以场景管理这里还可以有个分线的做法,玩家多的时候,不同线不可见,玩家少的时候进行合并。

消息同步

状态同步

状态同步大多数游戏都比较合适的,一个场景内人数比较多,状态同步的好处是天然防作弊,因为所有的东西都是服务器计算。mmo一般都是基于状态同步实现的,一般是影子跟随,而一些射击类游戏甚至采用向前模拟的方式来做。

帧同步

对延迟要求比较高entity数量不多的游戏采用的方法,常用的是moba用帧同步比较多,比如王者荣耀。针对状态同步,帧同步的优点网络带宽比较小,服务器几乎没有运算量。缺点是同一个场景中支持的entity数量不多,状态不同步时比较难查以及重连的过程中需要追帧。

如果做帧同步一些关键点为表现要和逻辑分离,随机算法和随机种子的一致性,数学库浮点换定点,三角函数采用泰勒展开或者查表法,需要保序的容器,timer不能基于钟表时间而需要帧timer,以及防作弊(一般都是投票法,或者服务器跑个验证端)

游戏维护和热更新

现在很多游戏在线更新bug甚至不停服更新慢慢变成一种强需求了,实现这种方式主要使用脚本热更新,热重启+逻辑内存以及ab服切换来实现。

python做游戏服务器_浅谈如何做一个游戏服务器相关推荐

  1. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  2. python 前端框架比较_浅谈五大Python Web框架

    说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: 虽然另一大脚本语 ...

  3. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  4. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #co ...

  5. python采用函数编程模式_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  6. python封装继承多态_浅谈JavaScript的面向对象和它的封装、继承、多态

    写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...

  7. python np array归一化_浅谈利用numpy对矩阵进行归一化处理的方法

    浅谈利用numpy对矩阵进行归一化处理的方法 本文不讲归一化原理,只介绍实现(事实上看了代码就会懂原理),代码如下: def Normalize(data): m = np.mean(data) mx ...

  8. python 共享内存变量_浅谈python多进程共享变量Value的使用tips

    前言: 在使用tornado的多进程时,需要多个进程共享一个状态变量,于是考虑使用multiprocessing.Value(对于该变量的具体细节请查阅相关资料).在根据网上资料使用Value时,由于 ...

  9. python中怎么计数_浅谈python中统计计数的几种方法和Counter详解

    1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b ...

最新文章

  1. python装饰器教学_Python装饰器学习(九步入门)
  2. Ubuntu之镜像iso安装系统
  3. 05-密码学基础-RSA的介绍
  4. 三十八、学Sql,不了解Sql注入怎么行?
  5. Python之字典类型数据常见操作及排序
  6. SPIR-V 研究:编译器基本原理
  7. 范例ppt_经营计划与执行管理PPT,全内容商业计划书,完整课件快速套用
  8. selector的使用
  9. mysql索引or_mysql索引之or条件
  10. BI工具那么多 该如何选择
  11. HTML(三)选择器--复杂选择器
  12. Hook技术(1):Hook技术简介
  13. Flink系列:物理分区分组broadcast、global、shuffle、forward、rebalance、rescale理解与实战
  14. 氨基酸序列碎裂by离子-生物信息学笔记
  15. 《如何阅读一本书》读书笔记
  16. Swift-基本运算符
  17. sas 结果导出到excel 打不开解决办法
  18. 微软出品:.net 微服务:容器化.net架构指南
  19. 安卓app保持屏幕常亮
  20. EOS系列六:wallet钱包、key公私钥对、account帐号的关系

热门文章

  1. 夹缝中的垂直母婴电商贝莱优品们:生存之道怎么挖?
  2. 微星MAG B650M mortar wifi主板设置温度墙
  3. 正则表达式不区分大小写以及解决思路的探索 .
  4. replace()方法
  5. android打包诸多so成一个aar并调用aar中的so流程总结
  6. 从Android studio 2.3.3 升级到 3.1.3最新版本 导入旧项目遇到的诸多错误,终极解决办法!!
  7. 华为数字化转型之道 方法篇 第三章 数字化转型框架
  8. 【Spark亚太研究院系列丛书】Spark实战高手之路-第2章动手实战Scala第3小节(2)
  9. 计算机和hdmi无法正常显示,Win7系统下电脑HDMI连接显示器字体显示虚不清楚如何解决...
  10. 2019年学习java还有前途吗?