erlang遊戲原始碼 英雄遠征分析

2021-07-06 07:18:47 字數 2726 閱讀 6875

erl +p 1024000 +k true -smp disable -name [email protected] -setcookie sd2 -mnesia extra_db_nodes ["'[email protected]'"] -boot start_sasl -config log  -s sd gateway_start -extra 127.0.0.1 5566 0

+p 1024000 erlang節點系統的最大併發程序數;

+k true | false 是否開啟kernel poll,就是epoll;

-smp

disable smp 多處理器

-name

-name name 給乙個erlang節點/程序設定乙個名稱

-setcookie

cookie 給節點設定cookie

-mnesia extra_db_nodes  當無盤節點需要從網路上的乙個遠端節點找到schema定義,則我們需要從-mnesia extra_db_nodes

-boot file  

指定啟動使用的boot檔案,預設是$root/bin/start.boot,在這個目錄下還有start_clean.boot,start_sasl.boot。如果需要sasl的話,就「-boot start_sasl 」;

-extra

引數-s mod [func [arg1, arg2, ...]]

-config config

指定配置檔案,這個是很有用的

除錯巨集-ifdef(debug).-define(log(msg,list), io:format(msg,list)).-else.-define(log(msg,list), ok).-endif. 

啟動:1.script/

%% 啟動資料庫mysql

%% 啟動超級監聽sd_gateway_sup

-->sd_gateway_sup.erl

-->sd_gateway.erl

stop: %% 組合主程序的名字 %% 找到這個程序  %% 殺死這個程序

start_raw_server:%% 組合程序名字 %% 查詢是不已經存在  %% 建立乙個程序負責監聽gen_tcp:listen

,mod_disperse.erl

-->sd_gateway_server.erl

start_raw_server開啟tcp_server

1.開啟乙個程序負責code_start-》gen_tcp:listen成功就傳送乙個訊息回到父程序註冊程序名字,再開啟乙個等待連線程序

2.如果gen_tcp:accept成功連線上就傳送給父類乙個訊息istarted再開啟另外乙個

mod_disperse 線路分布

1.net_kernel呼叫這個方法來訂閱節點狀態變動的訊息,分布式節點

2.ets 儲存伺服器節點 

3.節點之間互相通知

run.sh

-->sd_sup.erl,sd_networking.erl

sd_sup 

1.監控樹

sd_networking

start:啟動需要的一些子監聽

mod_kernel

1.初始化ets表快取

2.%% mysql資料庫連線初始化

3.初始化表資料,就是需要讀取的資料到ets表

start_disperse 線路分布,集群

1.net_kernel:monitor_nodes 節點訂閱

2.建立ets 表儲存server路線 集群資訊,以後和其它線路有關的廣播都經過它傳遞

3.加入到集群寫到資料庫,遍歷ping同所有節點,通知其它節點它的加入和資訊   不解:資料庫開始怎麼存在nodes,後面無法ping???

mod_rand隨機種子

sd_tcp_client_sup客戶端監控樹  

-->sd_reader

1.啟動乙個普通程序 login_parse_packet解析登陸

用來監控每個connection的處理程序

sd_tcp_listener_sup 監聽樹

-->sd_tcp_acceptor_sup 等待連線監聽

sd_tcp_acceptor

sd_tcp_listener

tcp_listener裡啟動tcp伺服器,監聽埠,並且通過 tcp_acceptor_sup啟動n個tcp_accetpor

tcp層:

sd_read.erl-->

1.做個沙河驗證

2.登陸處理使用非同步接受格式len+cmd+data,len是16位位元位就是兩個位元組,cmd同樣,所以頭就是4個位元組。驗證頭後就取得後面的資料data,先通過routing把資料解析處理    [h1, h2, _, _, _] = integer_to_list(cmd),

module = list_to_atom("pt_"++[h1,h2]),(本身就是list)

3.%%先驗證登陸在裡面加入md5驗證碼,同時使用client的record記錄下登陸情況再放回等待資料

4. %%讀取玩家列表

5. %%建立角色

6.%%刪除角色

7.%%進入遊戲-->do_parse_packet 處理以後的邏輯

mod_login:login(start, [id, client#client.accname], socket)

-->分別啟動各種模組並且初始化他們,再初始化mod_player,寫入ets快取狀態,上線之後的一些處理例如:通知好友等

英雄遠征Erlang原始碼分析(8) 怪物相關

與怪物相關的模組有三個 mod mon create.erl,mod mon active.erl,lib mon.erl mod mon create 建立負責建立怪物的程序,通過mod mon create create mon monid,scene,x,y,type 建立怪物程序 怪物建立程...

英雄遠征Erlang原始碼分析(4) TCP連線處理

在start tcp 0中啟動了sd tcp listener sup監控樹,並掛到sd sup下。其後啟動的程序樹形關係如下 這是遊戲伺服器啟動後使用observer觀察到的遊戲內程序關係圖,0.68.0 為start tcp 0啟動的sd tcp listener sup監控樹,0.70.0 為...

英雄遠征Erlang原始碼分析(9) 戰鬥流程解析

和戰鬥相關的模組有mod battle.erl 當玩家程序和怪物程序被建立的時候都會通過mod battle start link 建立乙個戰鬥程序。該戰鬥程序的state,用於儲存玩家上次出手或者使用技能的時機,用於cd的判斷 record state,開始戰鬥的時候,生成攻擊方和防守方的 bat...