关于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 ...
随机推荐
- 第2阶段——编写uboot之硬件初始化和制作链接脚本lds(1)
目标: 1.关看门狗 2.设置时钟 3.初始化SDRAM (初始化寄存器以及清除bss段) 4.重定位 (将nand/nor中代码COPY到链接地址上,需要初始化nandflash,读flash) 5 ...
- §--------算法分界线--------§
如题 As said in the title~ 计算机的cpu计算从根源上由最基本的逻辑电路(晶体管)组成,由此衍生出最基本的数值运算:四则运算.而此后所有的高级算法都是建立在这个基本计算原理(逻辑 ...
- Socket通信中AF_INET 和 AF_UNIX域的区别
转载:http://blog.csdn.net/sandware/article/details/40923491 1. AF_INET域socket通信过程 典型的TCP/IP四层模型的通信过程. ...
- 201521044091 《java程序设计》第八周学习总结
本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容.1.2 选做:收集你认为有用的代码片段 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1)1.1 实验 ...
- 201521123036 《Java程序设计》第2周学习总结
本周学习总结 java数据类型: 基本类型:整数,浮点,boolean类 引用类型:数组,类,接口,null类型 String类:String类的对象不可变,字符串API,大量修改字符串使用Strin ...
- 201521123023《Java程序设计》第13周学习总结
1. 本周学习总结 (1)网络中为了进行数据交换(通信)而建立的规则.标准或约定(=语义+语法+规则)称之为协议(常用http/ftp) (2)大致熟悉了TCP协议,但是UDP怎么辣么蓝,好理解却用不 ...
- 201521123122 《java程序设计》第十周学习总结
## 201521123122 <java程序设计>第十周实验总结 ## 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次P ...
- 一、React Native 搭建开发环境(1)(Mac OS - IOS项目)
React Native是Facebook推出的一个开发IOS和安卓APP的技术.至于更多的详情,这里不再描述,大家可以自行百度它的定义. 目的: 由于我想在一台电脑上同时开发IOS和Android两 ...
- python函数式编程,列表生成式
1.python 中常见的集中存储数据的结构: 列表 集合 字典 元组 字符串 双队列 堆 其中最常见的就是列表,字典. 2.下面讲一些运用循环获取字典列表的元素 >>> dic={ ...
- 如何定制 Calico 网络 Policy - 每天5分钟玩转 Docker 容器技术(70)
Calico 默认的 policy 规则是:容器只能与同一个 calico 网络中的容器通信.本节讨论如何定制 policy. calico 能够让用户定义灵活的 policy 规则,精细化控制进出容 ...