1. 程式人生 > >erlang遊戲原始碼--英雄遠征分析

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



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/
gateway.sh -->sd.erl -->gateway.app
-->sd_gateway_app.erl 
%% 啟動資料庫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.erl -->server_start-->server.app-->sd_server_app.erl
-->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層:
 server.app通過application:start()-->sd_server_app啟動sd_sup頂級監聽,sd_networking啟動各種子監聽(注意只是啟動子監聽不是啟動子監聽裡面的監聽或者工作者)-->sd_tcp_client_sup,sd_tcp_listent_sup-->sd_tcp_listener_sup啟動sd_tcp_accepte_sup監聽,和sd_tcp_listener它裡面啟動網路監聽Listener成功之後啟動10個accepte等待連線,主要有一個連線上了就繫結socket啟動一個sd_tcp_client_sup的子工作者sd_reader接受訊息,同時再啟動一個accetp等待連線。採用的是非同步和廣播。


 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快取狀態,上線之後的一些處理例如:通知好友等