关于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 ...
随机推荐
- 数据库学习任务一:使用vs2010建立数据库
数据库应用程序的开发流程一般主要分为以下几个步骤: 创建数据库 使用Connection对象连接数据库 使用Command对象对数据源执行SQL命令并返回数据 使用DataReader和DataSet ...
- 基于NIOS-II的示波器:PART4 系统调试&测试
本文记录了在NIOS II上实现示波器的第四部分. 本文主要包括:修改部分BUG,以及测试 本文所有的硬件以及工程参考来自魏坤示波仪,重新实现驱动并重构工程. version 1.0 界面修改& ...
- 关于SpringMVC项目报错:java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/xxxx.xml]
关于SpringMVC项目报错:java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/xxxx ...
- 软件工程(GZSD2015)学生博客列表
2015年贵州师范大学软件工程课程学生博客列表 陈小丽 郑倩 唐洁 周娟 李利思 肖俊 罗文豪 周静 徐明艳 毛涛 邓洪虹 岳庆 李盼 安坤 何亚 涂江凤 张义平 杨明颢 杨家堂 胡贵玲 寿克霞 吴明 ...
- Beta版本冲刺计划安排
1.介绍小组新加入的成员,Ta担任的角色 王婧:web界面以及前端和后台的交互 柯怡芳:PM以及文档 陈艺菡:修复bug以及文档 钱惠:web界面以及前端和后台的交互 林凯:测试人员 吴伟君(新成员) ...
- 201521123068 《java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 泛型,即参数化类型,不考虑类型参数的继承关系,getClass方法的返 ...
- 201521123085 《Java程序设计》第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 代码: ...
- 201521123037 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口: 接口简而言之是方法声明和常量值的集合,接口中所有的方法默认为public ...
- 201521123054 《Java程序设计》第5周学习总结
1. 本周学习总结 2. 书面作业 作业参考文件下载 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出 ...
- 201521123029《Java程序设计》第十二周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...