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

另外很快就要搞新项目,决定新项目就直接上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游戏服设计系列的更多相关文章

  1. Elixir游戏服设计五

    在<Elixir游戏服设计一>里提到,按照系统功能划分成app要保证原子性很难, 现在想想也没那么难.保证原子性,无非就是需要某个单点去完成操作.那么选择玩家进程去做原子性工作就可以了. ...

  2. Elixir游戏服设计一

    在Erlang游戏服设计总结http://www.cnblogs.com/rubyist/p/5530575.html里, 我提到我想要的游戏服设计方法,希望以应用做为基础构建块.最近我在学习elix ...

  3. 简单Elixir游戏服设计- 游戏玩法介绍

    抄以前的,做了点修改. 到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法. 为什么我们还不做客户端接入.协议指定呢?为什么还没有网关和数据存储呢.在我接手的游戏, 这些通常已经定下来了,我 ...

  4. Elixir游戏服设计三

    玩家进程用gen_server来建模,我不直接使用 use GenServer, 而是使用exactor,该库可以去掉反锁的接口定义. 我们新建一个 player_server_manager app ...

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

    有了玩家模型,我们试试让玩家进程跑起来. 需要搞个PlayerSupervisor来负责启动和监控玩家进程. defmodule PlayerSupervisor do use Supervisor ...

  6. 简单Elixir游戏服设计-玩家进程注册

    上回说用Registry 做本地注册(跨服可以用syn,只是稍微麻烦点,需要模拟global注册机制,写个封装模块). 修改game_server 项目的mix.exs, 增加应用启动 def app ...

  7. Elixir游戏服设计四

    上章说到我们要引入syn https://github.com/ostinelli/syn/ 看过文档,它并没有直接提供{via, Module, Name} 相关的方法.我们需要封装一下. Name ...

  8. Elixir游戏服设计二

    搞一个例子,而没有实际的目标,做起来真是烦人.几次三番都想放弃. 后来想想,即使最后完成不了完整的服务器,把需要的知识点搞搞,摸熟悉也是好的. 这里没有完整的项目目录,主要是对需要的指点进行整理.要完 ...

  9. 简单Elixir游戏服设计-玩法simple_poker

    上回介绍了玩法,现在编写了玩法的简单建模. 做到现在感觉目前还没有使用umbrella的必要(也许以后会发现必要吧),model 应用完全可以合并到game_server. 代码还在https://g ...

随机推荐

  1. 使用js jquery分别获取地址栏参数值

    使用JS获取地址栏参数 方法一: function GetQueryString(name) { var reg = new RegExp("(^|&)"+ name +& ...

  2. WPF DEV实现手风琴效果

    说明 最近用WPF+DevExpress做项目时,需要做一个类似手风琴的效果,效果的界面如下.因为没有现成的控件,需要自定义模板,所以写了一个Demo和大家分享,项目中可以根据实际情况使用.如果你用不 ...

  3. Java8 Stream简介

    Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响. lambd ...

  4. positio:absolute与position:relative的区别

    absolute 能让元素 inline-block 化:例如一个div标签默认宽度是100%显示的,但是一旦被absolute属性缠上,则100%默认宽度就会变成自适应内部元素的宽度. float ...

  5. Spring集成RabbitMQ-连接和消息模板

    ConnectionFactory ConnectionFactory是RabbitMQ服务掌握连接Connection生杀大权的重要组件 有了它,就可以创建Connection(org.spring ...

  6. Linaro系统获取root权限方法

    在Zedboard上根据教程安装Linaro Ubuntu后出现一只无法获取Root权限,导致无法挂载U盘等问题. 具体体现在sudo -s命令之后,出现如sudo:must be setuid ro ...

  7. Bootstrap框架的了解和使用(一)

      前  言 Bootstrap 什么是 Bootstrap?Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JavaScrip ...

  8. 学号:201521123116 《java程序设计》第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 List<Entry<String,Integer> ...

  9. 201521123033《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 参考资料: 百度脑图 XMind 2. 书面作业 作业参考文件下载 1.代码阅读:Child压缩包内源代码 1.1 com.p ...

  10. Java: server/client 心跳机制实现 示例

    心跳机制 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制. 大部分CS的应用需要心跳机制.心跳机制一般在Server和Client都要实现,两者实现原理 ...