Elixir游戏服设计五
在《Elixir游戏服设计一》里提到,按照系统功能划分成app要保证原子性很难,
现在想想也没那么难。保证原子性,无非就是需要某个单点去完成操作。那么选择玩家进程去做原子性工作就可以了。
比如要重置某个任务,需要花费金币和背包里某个物品,那么大概的逻辑是这样的。在玩家进程里
def reset_task(task_id) do
{need_gold, need_item} = Task.reset_need
with
:ok = gold_enough(need_gold) #使用玩家进程的数据
:ok = BagServer.item_enough(need_item) #使用背包进程的数据
do
{:ok, new_state} = cost_gold(need_gold) #使用玩家进程数据
:ok = BagServer.cost_item(need_item) #使用背包进程数据
TaskServer.reset(task_id) #使用任务进程数据
end
end
只不过说这样做以后,发觉Bag和Task进程做的工作也不多,不像玩家进程那么活泼。
如果想让Bag和Task有更多职责,你需要把reset_task之类的
操作直接交由他们做,比如如下。
def reset(task_id) do
need = {need_gold, need_item} = reset_need
with
:ok = PlayerServer.gold_enough(need_gold)
:ok = BagServer.item_enough(need_item)
do
:ok = PlayerServer.cost(need) ## 这里是原子的操作,同上面一样操作cost
reset(task_id)
end
end
但需要分清楚一些操作还是要交由某个单点去做(比如玩家进程),费心去理清这点,显得烦人。
而且每个模块需要知道很多其他模块,比如TaskServer需要使用BagServer,这也是一个糟糕之处。
这么一想,我还真找不到要划分成应用(进程那种)的理由了;一个库应用,甚至于一个模块就可以满足需求。
Elixir游戏服设计五的更多相关文章
- 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游戏服设计系列
写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. ...
- 简单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 ...
随机推荐
- Spring-MVC开发步骤(入门配置)
Spring-MVC开发步骤(入门配置) Step1.导包 spring-webmvc Step2.添加spring配置文件 Step3.配置DispatcherServlet 在web.xml中: ...
- struts2和spring mvc的比较
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt236 Struts2 Springmvc 机制 基于filt ...
- 第3阶段——内核启动分析之make menuconfig内核配置(2)
目标: 分析make menuconfig内核配置过程 在上1小结中(内核编译试验)讲到了3种不同的配置: (1)通过make menuconfig 直接从头到尾配置.config文件 (2) 通过m ...
- Linux-grep 命令和find 命令 (6)
grep与find区别: grep:查找指定目录下过滤文本文件中行数据 find:查找指定目录下文件 grep使用 格式: grep "text" * [选项] 选项: ...
- Linux下设置Tomcat虚拟路径
问题描述:我在上传图片的位置不在Tomcat服务器下,用户无法访问 解决方案:配置Tomcat虚拟路径使用户可以访问图片 配置Tomcat # cd /usr/local/apache-tomcat- ...
- 定宽块状元素居中 1记(text-align/margin:0 auto)
对于text-align:center的用法只是针对文本相对于父元素的居中,例如: #jz2{ width:300px; margin: 10px auto; border:2px solid red ...
- JSON与String之间互转
一,String转json 这个JSON.parse()与eval()都可以实现,但是它们是有区别的, JSON.parse对json字符串要求比eval()更为严格,key名称(例如name)全部必 ...
- 201521123095 《Java程序设计》第1周学习总结
1. 本周学习总结 开始了对JAVA的初步了解和学习,了解了如何编写简单的JAVA程序. 了解了Java的诞生及发展以及如何运用JVN JRE JDK JVM让JAVA可以 ...
- 201521123063 《Java程序设计》 第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...
- 201521123017 《Java程序设计》第10周学习总结
1. 本周学习总结 2. 书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 1.1 截图 1.2 4-2中fin ...