Elixir游戏服设计三
小编导读:
好了现在让我们编写PlayerServer模块(现在是简单的,而且我还未知有什么需要调整的,后续随着服务器设计而演化吧)。
好了,这一章就到这。遗留的问题有,我们通常需要给玩家进程一个名字,而不是通过pid,如果是单节点的话, local 注册已经足够,如果是跨服访问,我们需要一个分布式的注册机制(实际上分布式注册机制容易有坑,如无必要,千万别)。比如gporc,比如syn。 前者比较有名,我以前在erlang用过,之前有碰到莫名奇妙的问题。所以下章试试syn吧。
defmodule PlayerServerManager do use Application # See # for more information on OTP Applications def start(_type, _args) do import Supervisor.Spec, warn: false children = [ # Define workers and child supervisors to be supervised # worker(PlayerServerManager.Worker, [arg1, arg2, arg3]), ] # See # for other strategies and supported options opts = [strategy: :one_for_one, name: PlayerServerManager.Supervisor] Supervisor.start_link(children, opts) end end
Elixir游戏服设计三
我们在PlayerServerManager里增加启动接口如下
跑 mix deps.get,成功了依赖就准备好了。
写到这里发现之前Player和BaseInfo @behavior [email protected], 既然之前没报错,我就把它去掉了,测试依然通过。说明其实可能只需要
玩家进程就叫player_server吧。把它改成我需要的。
测试通过。
标签:class style log http it si 使用 la 代码
我们新建一个 player_server_manager app吧, 使用 mix new player_server_manager --sup, 会给我们增加sup。然后在mix.exs里增加exactor的依赖如下:
def start_player_server(%Player{} = player) do Supervisor.start_child(PlayerServerManager.Supervisor, [player]) end
让我们先增加个查询钻石的接口吧。
玩家进程用gen_server来建模,我不直接使用 use GenServer, 而是使用exactor,该库可以去掉反锁的接口定义。
defmodule PlayerServerManagerTest do use ExUnit.Case doctest PlayerServerManager setup do Application.stop(:player_server_manager) :ok = Application.start(:player_server_manager) end setup do player = Player.new(0) {:ok, player: player} end test "start player_server", %{player: player} do assert {:ok, pid} = PlayerServerManager.start_player_server(player) assert PlayerServer.gem(pid) == 0 end end
默认生成的player_server_manager.ex
因为玩家进程是动态创建的,因此采用simple_one_for_one, 同时我不需要默认传参数,还有我不需要重启。
defp deps do [{:exactor, "~> 2.2"}] end
在player_server_manager_test.exs里增加测试代码
defmodule PlayerServerManager do use Application # See # for more information on OTP Applications def start(_type, _args) do import Supervisor.Spec, warn: false children = [ # Define workers and child supervisors to be supervised worker(PlayerServer, [], restart: :temporary), ] # See # for other strategies and supported options opts = [strategy: :simple_one_for_one, name: PlayerServerManager.Supervisor] Supervisor.start_link(children, opts) end end
标签:class style log http it si 使用 la 代码
defmodule PlayerServer do use ExActor.GenServer defstart start_link(player), do: initial_state(%{player: player, socket: nil}) defcall gem, state: state, do: reply(state.player.base_info.gem) end
defdelegate。
热门资讯
05-27
· 【IT168 资讯】子曰:工欲善其05-27
·对线、团战再不会坑队友05-27
·传微软下令未来《光晕》《战争机05-27
·并抽取了风暴里面的元素作为镜腿05-27
·自游戏测试期间就深受广大玩家的05-27
·边玩游戏边抽奖 凯时娱乐幸运彩05-27
·家庭娱乐本 操作系统预装Windows05-27
·90后造虚假游戏平台 诈骗玩家20
传奇特荐
05-04
·《期间》评最具影响力50款科技产05-05
·虐心游戏《Choppa》评测:虐的就05-06
·慈文传媒第一季度矫正通告:上半05-19
·女主播直播斗鸡游戏 衣着暴露动05-19
·眼下就是花式告白的最佳时机05-19
·《白发魔女传》删档测试今日开启05-19
·整体音乐让游戏带入感非常不错05-20
·《诛仙手游》中还有凄凉肃杀的空05-21
·pass:深圳市巨彩科技05-21
·pass:棋牌游戏银商