关于Elixir游戏服设计系列
写着写着就废球了,感觉空对空,实在没什么意思。
另外很快就要搞新项目,决定新项目就直接上elixir了。目前该做的准备工作已经探索了一些了。
以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好。
游戏大体分为如下服务器 . 网关服务器(必须)
. 游戏服务器(必须)
. 后台管理服务器(一般必须)
. 数据存储服务器(必须)
. 支付服务器(安桌或者第三方回调的话,必须) Elixir umbrella 项目目录结构可大概如下 . 游戏数据模型(包括简单的获取更新逻辑)
. 通讯协议 https://github.com/bitwalker/exprotobuf
. 配置和常量
. 一般性的工具(日期时间处理https://hex.pm/packages/timex、随机数等)
. 数据访问接口
. 网关、游戏、后台、支付等上层应用 常用基础设施
. 数据库客户端(随数据库服务器定)
. 进程注册与查找(全局)gproc(基于ets) 或syn 基于 mnesia 内存存储
. 定时任务 https://github.com/c-rack/quantum-elixir
. socket 接入 ranch
. 后台web支持 cowboy、plug
. 日志 自带logger
. 日志backend backend https://github.com/onkel-dirtus/logger_file_backend
. 进程池 poolboy (暂时没有用到) 测试与文档
. 能够测试驱动开发当然最好
. DocTest 如果有最好
. 单元测试 自带ExUnit 模拟 https://github.com/jjh42/mock
. 文档 函数功能描述、spec (public 函数要有)
. ExDoc 附带生成物(可不理会) 具体需要测试的地方
. DocTest 函数自带测试
. 数据模型的单元测试
. GenServer 的测试 关于测试与副作用限制
. 代码函数尽量只做一件事,并且是函数式的,没有副作用
. 有副作用的地方应该限制到GenServer 的handle_XXX
. 这样做的结果是一堆小函数, 容易支持测试 关于配置和常量生成
. 可以采用类似exprotobuf 做成通用的。(有个xlsxir 库可直接读取excel)
. 好处,编译自动处理;坏处, 没有生成代码,不方便查看。 其他工具
exactor 简化GenServer接口定义
pipe_here 管道操作符参数位置 关于socket与玩家进程
. ranch 接受socket连接后会起进程,建议就这样让socket进程与玩家进程独立
另外配置代码部分之前写的比较差劲,是从csv 转。今天使用了处理xlsx的库,并且用宏实现了。达到足够灵活的效果。如下
defmodule RoomConfig do
use ConfigGen, path: "lib/room_config.xlsx"
get
ids
all
ids_by :game_type
items_by :game_type
ids_by2 :game_type, :sub_type
items_by2 :game_type, :sub_type
ids_by_fn :ids_lq_10, fn item -> item.id <= 10 end
items_by_fn :items_lq_10, fn item -> item.id <= 10 end
end
它会编译生成如下方法
非常方便是不是?再有更复杂的需求,可以直接RoomConfig里定义需要的函数,然后通过@items 属性去操作。
关于Elixir游戏服设计系列的更多相关文章
- Elixir游戏服设计五
在<Elixir游戏服设计一>里提到,按照系统功能划分成app要保证原子性很难, 现在想想也没那么难.保证原子性,无非就是需要某个单点去完成操作.那么选择玩家进程去做原子性工作就可以了. ...
- Elixir游戏服设计一
在Erlang游戏服设计总结http://www.cnblogs.com/rubyist/p/5530575.html里, 我提到我想要的游戏服设计方法,希望以应用做为基础构建块.最近我在学习elix ...
- 简单Elixir游戏服设计- 游戏玩法介绍
抄以前的,做了点修改. 到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法. 为什么我们还不做客户端接入.协议指定呢?为什么还没有网关和数据存储呢.在我接手的游戏, 这些通常已经定下来了,我 ...
- Elixir游戏服设计三
玩家进程用gen_server来建模,我不直接使用 use GenServer, 而是使用exactor,该库可以去掉反锁的接口定义. 我们新建一个 player_server_manager app ...
- 简单Elixir游戏服设计-玩家进程跑起来
有了玩家模型,我们试试让玩家进程跑起来. 需要搞个PlayerSupervisor来负责启动和监控玩家进程. defmodule PlayerSupervisor do use Supervisor ...
- 简单Elixir游戏服设计-玩家进程注册
上回说用Registry 做本地注册(跨服可以用syn,只是稍微麻烦点,需要模拟global注册机制,写个封装模块). 修改game_server 项目的mix.exs, 增加应用启动 def app ...
- Elixir游戏服设计四
上章说到我们要引入syn https://github.com/ostinelli/syn/ 看过文档,它并没有直接提供{via, Module, Name} 相关的方法.我们需要封装一下. Name ...
- Elixir游戏服设计二
搞一个例子,而没有实际的目标,做起来真是烦人.几次三番都想放弃. 后来想想,即使最后完成不了完整的服务器,把需要的知识点搞搞,摸熟悉也是好的. 这里没有完整的项目目录,主要是对需要的指点进行整理.要完 ...
- 简单Elixir游戏服设计-玩法simple_poker
上回介绍了玩法,现在编写了玩法的简单建模. 做到现在感觉目前还没有使用umbrella的必要(也许以后会发现必要吧),model 应用完全可以合并到game_server. 代码还在https://g ...
随机推荐
- 使用jquery.form.js提交表单上传文件
方法: 1.formSerilize() 用于序列化表单中的数据,并将其自动整理成适合AJAX异步请求的URL地址格式. 2.clearForm() 清除表单中所有输入值的内容. 3.restF ...
- fetch的使用说明
1.RN官方文档中,可使用XMLHttpRequest var request = new XMLHttpRequest(); request.onreadystatechange = (e) =&g ...
- angular之scope.$watch
某“大神”挖了个陨石坑,我于是乎似懂非懂的接手,玩了一个月angular.现在项目告一段落,暂别了繁重的重复性工作,可以开始回顾.认真的折腾下之前犹抱琵琶的angular. angular吸引人的特性 ...
- C# 引用类型之特例string
在C#编程的时候经常会使用字符串(string)类型,它也是引用类型,但是处处都不作为引用的用法来使用,实属特例,下来我一一罗列出来,供自己记忆方便: 1)字符串的直接赋值:本身字符串就是引用类型,应 ...
- 201521123082《Java程序设计》第3周学习总结
201521123082<Java程序设计>第3周学习总结 标签(空格分隔): Java 1.本周学习总结 XMind图: 2.书面作业 Q1.代码阅读 public class Test ...
- 团队作业4---第一次项目冲刺(AIpha版本)第二天
一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.界面 完成了主页及登录页面 2.功能 完成了后端数据处理的全部基本功能:a.数据结构设计及数据交互操作 b.博客页面数据采 ...
- Java 第八周总结
1. 本周学习总结 2. 书面作业 1.List中指定元素的删除 1.1 实验总结 list中可以通过list.get(i)来获取具体第几个的元素的值,再通过compareTo来对比 通过in.has ...
- 201521123096《Java程序设计》第四周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 继承能够动态绑定,运行时能够自动的选择调用方法,十分方便. 2. 书面作业 (1)注释的应用 ...
- 201521123070 《JAVA程序设计》第9周学习总结
1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 Q1. 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 ...
- eclipse 项目引入第三方jar包 3种方法
我们在用Eclipse开发程序的时候,经常要用到第三方jar包.引入jar包不是一个小问题,由于jar包位置不清楚,而浪费时间.下面配图说明3种Eclipse引入jar包的方式. 1.最常用的普通操作 ...