Elixir游戏服设计四
上章说到我们要引入syn https://github.com/ostinelli/syn/
看过文档,它并没有直接提供{via, Module, Name} 相关的方法。我们需要封装一下。
Name暂时可以用id,如果有需要再调整
以后有回调需求的话,刚好也可以做在那个模块里。
在player_server_manager项目里增加{:syn, "1.4.0"} 运行命令获取依赖
修改application 方法,增加依赖
def application do
[applications: [:logger, :syn],
mod: {PlayerServerManager, []}]
end
然后在项目里增加PlayerRegistry模块
defmodule PlayerRegistry do
def register_name(name, pid) when is_pid(pid) do
case :syn.register(name, pid) do
:ok -> :yes
_ -> :no
end
end def unregister_name(name) do
:syn.unregister(name)
:ok
end def whereis_name(name) do
:syn.find_by_key(name)
end def send(name, msg) do
case whereis_name(name) do
:undefined ->
exit({:badarg, {name, msg}})
pid ->
Kernel.send pid, msg
pid
end
end
end
参照:global 模块实现。
修改PlayerServer.start_link 如下
def via_tuple(id), do: {:via, PlayerRegistry, id}
def start_link(player) do
GenServer.start_link(__MODULE__, %{player: player, socket: nil}, name: via_tuple(player.base_info.id))
end
PlayerServerManager.start 修改,增加syn的初始化,
def start(_type, _args) do
import Supervisor.Spec, warn: false
:syn.init()
children = [
# Define workers and child supervisors to be supervised
worker(PlayerServer, [], restart: :temporary),
] # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :simple_one_for_one, name: PlayerServerManager.Supervisor]
Supervisor.start_link(children, opts)
end
PlayerServerManagerTest增加测试代码
test "player_registry", %{player: player} do
assert {:ok, pid} = PlayerServerManager.start_player_server(player)
assert PlayerServer.gem(PlayerServer.via_tuple(player.base_info.id)) == 0
end
测试成功,ok。目前看起来还好。分布式的注册以及冲突处理留待以后再做测试了。
写到这,发现via_tuple要能接受player和id2种参数更好,方便点。
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游戏服设计系列
写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. ...
- 简单Elixir游戏服设计-玩家进程注册
上回说用Registry 做本地注册(跨服可以用syn,只是稍微麻烦点,需要模拟global注册机制,写个封装模块). 修改game_server 项目的mix.exs, 增加应用启动 def app ...
- Elixir游戏服设计二
搞一个例子,而没有实际的目标,做起来真是烦人.几次三番都想放弃. 后来想想,即使最后完成不了完整的服务器,把需要的知识点搞搞,摸熟悉也是好的. 这里没有完整的项目目录,主要是对需要的指点进行整理.要完 ...
- 简单Elixir游戏服设计-玩法simple_poker
上回介绍了玩法,现在编写了玩法的简单建模. 做到现在感觉目前还没有使用umbrella的必要(也许以后会发现必要吧),model 应用完全可以合并到game_server. 代码还在https://g ...
随机推荐
- python 斐波那契数列 fibonacci
在python中生成fibonacci数列的函数 def fibonacci(): list = [] while 1: if(len(list) < 2): list.append(1) el ...
- 如何使用phpstudy本地搭建多站点(每个站点对应不同的端口)
到http://phpstudy.net/a.php/208.html下载phpstudy 1.装完phpstudy后,(假设安装在D盘,安装后开启服务) 在D:\phpStudy\WWW\路径下创建 ...
- KKlist团队目录
KKlist团队目录 一.Daily Scrum Meeting[Alpha] 4.22 day one 4.23 day two 4.24 day three 4.25 day four 4.26 ...
- 201521123110《java程序设计》第八周学习总结
1. 本周学习总结 2. 书面作业 1.List中指定元素的删除 上课就交了,编写时主要用remove方法,然后Iterator的remove()方法可删除当前下标为i的元素后,该元素后的所有元素将往 ...
- 201521123016《java程序设计》第4周学习总结
1. 本周学习总结 2. 书面作业 注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 面向对象设计(大作业1,非常重要) 2.1 将在网上商城购物或 ...
- 201521123030《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...
- 201521123004 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 注意: notify()/notifyAll()方法和wait()方法都只能在被声明为synchronized的方 ...
- Java十二周总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 201521123104《java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...
- 201521123115 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...