我把
在實(shí)現(xiàn)過程中session被做成了一個SyncDriver咱揍, 可以給actor發(fā)信但是沒有回調(diào)機(jī)制刀崖, 當(dāng)session發(fā)出一個message后它需要調(diào)用Wait()等待actor通知它已經(jīng)收到這個消息(通過actor回發(fā)一個MPK_OK)惊科。由于session工作在ASIO的事件循環(huán)中, 所有的session都被這一個thread來驅(qū)動亮钦, 所以如果每次發(fā)出一個messge到actor都需要進(jìn)行一次等待馆截, 通訊thread的效率必然很差。我們需要communication thread不斷讀取網(wǎng)絡(luò)層消息并轉(zhuǎn)發(fā)給對應(yīng)actor蜂莉,并且不需要等待actor的回復(fù)孙咪。
我目前的想法是在session中注冊一個actor的靜態(tài)成員函數(shù), 既然是static member function那么就可以保證不接觸到actor的內(nèi)部status巡语, 僅僅每次收到一個package header時候這個static memeber function決定繼續(xù)讀取多少字節(jié)的package body翎蹈。zero or non-zero, 等到讀取成功后再一次性打包成一個message發(fā)給對應(yīng)的actor男公。
這個package包含了1. package header荤堪, 2. package body合陵。header是固定的1byte, body是變長buffer澄阳,這個buffer通過全局memory pool進(jìn)行分配拥知。當(dāng)actor收到這個message后(MPK_NET), 處理對應(yīng)的package然后釋放掉package body碎赢。由于申請body buffer在ASIO時間循環(huán)thread中低剔, 釋放body buffer在actor message thread中, 所以需要設(shè)置memory pool為多線程enabled模式肮塞。
這里有個一假設(shè)襟齿, 網(wǎng)絡(luò)層傳入的package的header和body長度不依賴于actor當(dāng)前狀態(tài)。因?yàn)樽缘絪ession中的package header回調(diào)是static的枕赵, 無法獲取actor的狀態(tài)猜欺, 并且actor model也不允許session直接獲取actor的internal status。這個假設(shè)是合理的拷窜。目前的邏輯如下:
1. actor擁有session的pointer开皿, 并且在actor的生命周期內(nèi)session保證valid。
2. 初始化后session先和monoserver交互篮昧, 等成功登陸后monoserver創(chuàng)建player(actor)赋荆, 然后把session指針傳給player, 把player地址傳給session懊昨。
3. session收到header后通過player注冊的static memeber function決定如何接受network data stream并打包成一個package窄潭, 這個過程中如果需要buffer就通過global memory pool申請。
4. session發(fā)送這個package(header疚颊, body pointer)到player狈孔, 然后接受下一個header信认。材义。。
5. player收到這個message嫁赏, 處理其掂, 釋放body pointer回global memory pool。
整個過程中session沒有等待actor回復(fù)潦蝇, actor收到的總是一個完整的package款熬。