UI 协议事件派发机制的修改


修改的原因

  • 我们目前的版本里面 大量来自协议的Dispatcher严重影响代码的阅读和维护
  • 事件的逻辑处理和数据处理在框架层并没有明确分开
  • 事件派发能够有效的减少直接引用

实现原理

  • 在MobileZGameInstance中包含两个代理函数:OnProtocolRecvDelegate和PostProtocolRecvDelegate。当网络协议完成从protocol buffer转化为ProtocolTemplate之后会连续执行:
    OnProtocolReceivedDelegate().Broadcast(ProtocolObject); PostProtocolRecvDelegate().Broadcast(ProtocolObject); ProtocolObject->Process(Ins)

  • 我们在c++代码中完成他们的自动注册。manager被默认为是在创建的时候自动注册OnProtocolRecvDelegate,manager销毁的时候清理代理, 所以可以认为Manager的注册是永久的,UI则默认只注册PostProtocolRecvDelegate,而且UI这边是在Construct的时候进行自动注册,Destruct的时候默认取消注册,可以认为UI只会在显示的时候处理协议。GameInstance Destroy的时候取消所有的注册,

*当上述两个代理出发之后会执行下面的Lambda函数

    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 +协议名函数名的函数,那么该函数将会执行。相当于对协议的抵达做了相应的处理。
函数名字举例:OnRecvActivationKeyRspPostRecvActivationKeyRsp


用法

  • 如果一个类希望能够绑定上述的两个代理,需要实现接口类IProtocolProcessInterface
  • 需要在适当的地方调用RegisterDelegateUnRegisterDelegate
  • 按照需要实现自己的方法OnRecv+Protocol,既可以在c++中也可以在BP中实现该函数,c++中使用UFUNCTION标记函数,BP中直接声明函数即可。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 160,128评论 24 690
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 123,282评论 18 134
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 1,421评论 0 7
  • 标签: 成长 人脉管理 近朱者赤近墨者黑,多和比自己优秀的人聊天,让自己优秀。下午在雕刻时光约了前京东产品经理小...
    烽烟乱阅读 301评论 2 3
  • 实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机不和包括Java在内的任何语言绑定,它只与“Cla...
    CY_Frank阅读 396评论 0 0
  • 2014-01-13 命运由心起 ——小城散漫表达系列之“心起的命运” 火山 某日,一些微友转来关于星座的详细新版...
    朱云野阅读 116评论 0 1