Erlang游戏服设计总结

这主要是一年多来,个人从事Erlang游戏服开发中对一些事情的思考。

想到哪说到哪,没有条理可言。

欢迎讨论。

通常Erlang游戏服务的设计涉及到的东东包括如下:

  • 任务系统
  • 活动系统
  • 公会系统
  • 玩法系统
  • 好友系统
  • 聊天系统
  • 商城
  • 转盘
  • 以及其他

我经历过的项目不多,只有2个。在这2个项目中我看到系统建模都采用如下一锅端的方式:

  • 即玩家进程加载了所有玩家数据,处理所有可能的系统;
  • 整个游戏服通常只有玩家进程、公会进程、玩法进程以及一些公共进程。
  • 整个游戏服里你看到的都是进程,看不到应用。
  • 通常玩法进程很少,很多逻辑上有区别的玩法都简单粗暴塞进一个玩法进程

我很好奇,Erlang游戏服都这么做吗?在我看来,这一切都是乱糟糟的,不是说Erlang/OTP系统是以应用作为构建块的吗?

为什么我看不到任务应用,活动应用,公会应用、玩法应用、好友应用等等?以应用去划分系统不是更加清晰?也许还能按需加载

数据,而不是加载整个玩家数据呢?以应用建模,兴许能够更加容易复用代码呢?

再者所有东西糅杂在一起,系统的测试基本变得不可能;没有测试也就意味着bug.

尤其常见的是玩法进程夹杂了多种玩法逻辑,通过case if pattern match 去调用不同的代码。

通常搞好了一种玩法,也不经意导致其他玩法出现bug。(我在2个项目中都碰到了这个问题)。

我希望的游戏服设计应该是这样的:

  • 系统以应用做为构建块,你会有任务应用、好友应用、商城应用、公会应用等等
  • 以应用划分,玩家进程无需加载所有数据,需要的数据在相关的应用解决,甚至于对非热点数据,相关应用可能加载处理完就释放内存了。
  • 应用可单独测试,无需依赖其他东东。
  • 不同的玩法以不同的进程构建,一种玩法搞好了,你无需再去理它。

也许以应用去建模,为任务构建进程显得过于大材小用。甚至于说在玩家进程里处理数据更加方便,避免不必要的进程间通信消耗。

那么我想建模成库应用也是有好处的吧。

时间: 2024-08-24 15:46:58

Erlang游戏服设计总结的相关文章

Elixir游戏服设计三

玩家进程用gen_server来建模,我不直接使用 use GenServer, 而是使用exactor,该库可以去掉反锁的接口定义. 我们新建一个 player_server_manager app吧, 使用 mix new player_server_manager --sup, 会给我们增加sup.然后在mix.exs里增加exactor的依赖如下: defp deps do [{:exactor, "~> 2.2"}] end 跑 mix deps.get,成功了依赖就准

关于Elixir游戏服设计系列

写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. 游戏大体分为如下服务器 1. 网关服务器(必须) 2. 游戏服务器(必须) 3. 后台管理服务器(一般必须) 4. 数据存储服务器(必须) 5. 支付服务器(安桌或者第三方回调的话,必须) Elixir umbrella 项目目录结构可大概如下 1. 游戏数据模型(包括简单的获取更新逻辑) 2.

简单Elixir游戏服设计-玩家进程跑起来

有了玩家模型,我们试试让玩家进程跑起来. 需要搞个PlayerSupervisor来负责启动和监控玩家进程. defmodule PlayerSupervisor do use Supervisor def start_link(_opts) do Supervisor.start_link(__MODULE__, :ok, name: __MODULE__) end def init(:ok) do Supervisor.init([PlayerServer], strategy: :simp

Elixir游戏服设计六

接上章,我新建了个app做包含Table模型, TableServer等.Table桌子的代码暂时如下, 有一些状态还没用上 defmodule Table do @state_accept 0 #准备接入玩家 @state_ready 1 #开局准备? defdelegate [fetch(t, key), get_and_update(t, key, list)], to: Map defstruct [:config, :seats, :state] def new(config) do

Elixir游戏服设计四

上章说到我们要引入syn https://github.com/ostinelli/syn/ 看过文档,它并没有直接提供{via, Module, Name} 相关的方法.我们需要封装一下. Name暂时可以用id,如果有需要再调整 以后有回调需求的话,刚好也可以做在那个模块里. 在player_server_manager项目里增加{:syn, "1.4.0"} 运行命令获取依赖 修改application 方法,增加依赖 def application do [applicatio

简单Elixir游戏服设计- 创建项目

反正是写到哪算哪. 创建umbrella项目 mix new simple_game --umbrella 创建model项目 cd simple_game\apps mix new model 创建 game_server 项目 同样在apps目录下 mix new game_server 最后项目结构如下 我尝试把它发布出去,结果 https://github.com/rubyist1982/simple.git 和我预期的不一样,我初始应该以项目做仓库好点.

游戏开发经验谈(二):对战类全球服游戏的设计与实现

上篇文章<游戏开发经验谈(一):游戏架构里隐藏的五个坑及其应对方案>,我们主要讲解了游戏架构设计当中隐藏的一些坑及其应对方案,错过的小伙伴可以点击链接回溯之前的内容.本期内容,将会重点介绍对战类全球服游戏的设计思路与技术实现. 对战类游戏的设计思路 协议的选择 游戏设计之初,需要决定选择哪种协议来进行通讯.对于对战类游戏来说,首先推荐的肯定是UDP. 尽管UDP对开发基础有较高的要求,需要开发者自己实现传输成功检验.重传以及可靠性保证等,但相对于低开发成本的TCP,UDP在效率和时效性上都有极

同一世界服务器架构--Erlang游戏服务器

Erlang最大的优点是方便,很多基础功能都已经集成到Erlang语言中.之前用C++写服务器的时候,管理TCP连接很繁琐,需要写一大堆代码来实现.底层的框架需要写很多代码实现,这样既浪费时间,又会有很多BUG.但是用Erlang就方便多了,底层的一切你都不需要考虑,你只需要考虑,服务器的架构以及业务逻辑.从此让你彻底从底层的泥潭中解脱.我从去年年底开始了解学习Erlang,到现在我已经彻底爱上了Erlang.好了,废话不多说,开始详细介绍下我设计的这个服务器架构吧. 首先看下整个架构的布局,如

Erlang游戏开发-协议

Erlang游戏开发-协议 选择什么协议? 协议包含通讯协议和数据格式. 通讯协议 通讯协议目前常用的是:HTTP 和TCP .其有各自的特点根据游戏的特点而进行选择. HTTP HTTP比较成熟,使用极其广泛.具有丰富的基础软件和工具.对于简单的social game可以使用HTTP作为通讯协议.这类游戏对实时性要求不是很高,使用HTTP也很容易做到性能扩展,可以较好的满足需求.如果游戏前端使用HTML+js开发,那么只能使用HTTP了,需要较好的交互性和实时性时,只能使用HTTP长轮询来实现