关于Elixir游戏服设计系列

写着写着就废球了,感觉空对空,实在没什么意思。

另外很快就要搞新项目,决定新项目就直接上elixir了。目前该做的准备工作已经探索了一些了。

以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好。

游戏大体分为如下服务器

1. 网关服务器(必须)
2. 游戏服务器(必须)
3. 后台管理服务器(一般必须)
4. 数据存储服务器(必须)
5. 支付服务器(安桌或者第三方回调的话,必须)


Elixir umbrella 项目目录结构可大概如下

1. 游戏数据模型(包括简单的获取更新逻辑)
2. 通讯协议  https://github.com/bitwalker/exprotobuf
3. 配置和常量  
4. 一般性的工具(日期时间处理https://hex.pm/packages/timex、随机数等)
5. 数据访问接口
6. 网关、游戏、后台、支付等上层应用

常用基础设施
1. 数据库客户端(随数据库服务器定)
2. 进程注册与查找(全局)gproc(基于ets) 或syn 基于 mnesia 内存存储
3. 定时任务   https://github.com/c-rack/quantum-elixir
4. socket 接入   ranch
5. 后台web支持 cowboy、plug
6. 日志  自带logger 
7. 日志backend backend https://github.com/onkel-dirtus/logger_file_backend
8. 进程池 poolboy (暂时没有用到)

测试与文档
0. 能够测试驱动开发当然最好
1. DocTest 如果有最好 
2. 单元测试  自带ExUnit 模拟 https://github.com/jjh42/mock  
3. 文档  函数功能描述、spec (public 函数要有)
4. ExDoc 附带生成物(可不理会)

具体需要测试的地方
1. DocTest 函数自带测试
2. 数据模型的单元测试
3. GenServer 的测试

关于测试与副作用限制
1. 代码函数尽量只做一件事,并且是函数式的,没有副作用
2. 有副作用的地方应该限制到GenServer 的handle_XXX
3. 这样做的结果是一堆小函数, 容易支持测试


关于配置和常量生成
1. 可以采用类似exprotobuf 做成通用的。(有个xlsxir 库可直接读取excel)
2. 好处,编译自动处理;坏处, 没有生成代码,不方便查看。


其他工具
exactor  简化GenServer接口定义
pipe_here 管道操作符参数位置

关于socket与玩家进程
1. 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 属性去操作。

posted @ 2016-06-16 17:59  damnit  阅读(1405)  评论(0编辑  收藏  举报