在《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游戏服设计五的更多相关文章

  1. Elixir游戏服设计一

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

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

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

  3. Elixir游戏服设计三

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

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

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

  5. 关于Elixir游戏服设计系列

    写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. ...

  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. Spring-MVC开发步骤(入门配置)

    Spring-MVC开发步骤(入门配置) Step1.导包 spring-webmvc Step2.添加spring配置文件 Step3.配置DispatcherServlet 在web.xml中: ...

  2. struts2和spring mvc的比较

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt236   Struts2 Springmvc       机制 基于filt ...

  3. 第3阶段——内核启动分析之make menuconfig内核配置(2)

    目标: 分析make menuconfig内核配置过程 在上1小结中(内核编译试验)讲到了3种不同的配置: (1)通过make menuconfig 直接从头到尾配置.config文件 (2) 通过m ...

  4. Linux-grep 命令和find 命令 (6)

    grep与find区别: grep:查找指定目录下过滤文本文件中行数据 find:查找指定目录下文件 grep使用 格式:   grep "text"   *  [选项] 选项: ...

  5. Linux下设置Tomcat虚拟路径

    问题描述:我在上传图片的位置不在Tomcat服务器下,用户无法访问 解决方案:配置Tomcat虚拟路径使用户可以访问图片 配置Tomcat # cd /usr/local/apache-tomcat- ...

  6. 定宽块状元素居中 1记(text-align/margin:0 auto)

    对于text-align:center的用法只是针对文本相对于父元素的居中,例如: #jz2{ width:300px; margin: 10px auto; border:2px solid red ...

  7. JSON与String之间互转

    一,String转json 这个JSON.parse()与eval()都可以实现,但是它们是有区别的, JSON.parse对json字符串要求比eval()更为严格,key名称(例如name)全部必 ...

  8. 201521123095 《Java程序设计》第1周学习总结

    1. 本周学习总结     开始了对JAVA的初步了解和学习,了解了如何编写简单的JAVA程序.      了解了Java的诞生及发展以及如何运用JVN JRE JDK      JVM让JAVA可以 ...

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

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...

  10. 201521123017 《Java程序设计》第10周学习总结

    1. 本周学习总结 2. 书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 1.1 截图 1.2 4-2中fin ...