UI 協(xié)議事件派發(fā)機制的修改


修改的原因

  • 我們目前的版本里面 大量來自協(xié)議的Dispatcher嚴重影響代碼的閱讀和維護
  • 事件的邏輯處理和數(shù)據(jù)處理在框架層并沒有明確分開
  • 事件派發(fā)能夠有效的減少直接引用

實現(xiàn)原理

  • 在MobileZGameInstance中包含兩個代理函數(shù):OnProtocolRecvDelegate和PostProtocolRecvDelegate。當(dāng)網(wǎng)絡(luò)協(xié)議完成從protocol buffer轉(zhuǎn)化為ProtocolTemplate之后會連續(xù)執(zhí)行:
    OnProtocolReceivedDelegate().Broadcast(ProtocolObject); PostProtocolRecvDelegate().Broadcast(ProtocolObject); ProtocolObject->Process(Ins)

  • 我們在c++代碼中完成他們的自動注冊。manager被默認為是在創(chuàng)建的時候自動注冊O(shè)nProtocolRecvDelegate,manager銷毀的時候清理代理, 所以可以認為Manager的注冊是永久的,UI則默認只注冊PostProtocolRecvDelegate,而且UI這邊是在Construct的時候進行自動注冊,Destruct的時候默認取消注冊,可以認為UI只會在顯示的時候處理協(xié)議。GameInstance Destroy的時候取消所有的注冊,

*當(dāng)上述兩個代理出發(fā)之后會執(zhí)行下面的Lambda函數(shù)

    auto ProcessLambda = [=](UObject* Protocol, const TCHAR* Prefixes)
    {
        FString ClassName, RightName;
        Protocol->GetClass()->GetName().Split(TEXT("_C"), &ClassName, &RightName);
        FName FunctionName = FName(*(FString::Printf(TEXT("%s%s"), Prefixes, *ClassName)));
        UFunction* Function = Excuter->FindFunction(FunctionName);
        if (Function)
        {
            void* Parameters = (void*)(&Protocol);
            Excuter->ProcessEvent(Function, Parameters);
        }
    };

OnProtocolReceivedDelegate代理的Prefixes 是OnRecvPostProtocolRecvDelegate的Prefixes 是PostRecv
所以如果一個注冊了兩個代理的對象類中如果含有Prefixes +協(xié)議名函數(shù)名的函數(shù),那么該函數(shù)將會執(zhí)行。相當(dāng)于對協(xié)議的抵達做了相應(yīng)的處理。
函數(shù)名字舉例:OnRecvActivationKeyRsp, PostRecvActivationKeyRsp


用法

  • 如果一個類希望能夠綁定上述的兩個代理,需要實現(xiàn)接口類IProtocolProcessInterface
  • 需要在適當(dāng)?shù)牡胤秸{(diào)用RegisterDelegateUnRegisterDelegate
  • 按照需要實現(xiàn)自己的方法OnRecv+Protocol,既可以在c++中也可以在BP中實現(xiàn)該函數(shù),c++中使用UFUNCTION標(biāo)記函數(shù),BP中直接聲明函數(shù)即可。

uml圖: https://www.processon.com/view/link/584627dee4b0e742e4a9dcdd

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,062評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,251評論 0 7
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,624評論 30 472
  • 標(biāo)簽: 成長 人脈管理 近朱者赤近墨者黑,多和比自己優(yōu)秀的人聊天,讓自己優(yōu)秀。下午在雕刻時光約了前京東產(chǎn)品經(jīng)理小...
    烽煙亂閱讀 618評論 2 3

友情鏈接更多精彩內(nèi)容