`
eric_weitm
  • 浏览: 235368 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

注册回调机制

阅读更多
某网游服务端的注册回调机制
基本概念
GS:game server 主要是处理游戏逻辑和维护数据,其基本功能是响应客户端的命令。所以GS的核心模块是无限循环取消息、处理消息的过程。网游处理的核心对象是角色,而每个角色的处理逻辑是类似的,所以服务端可以编写通用的流程,分别处理不同状态、环境和属性下的角色逻辑。

服务端代码核心的编程思想是注册、回调。顾名思义,这种机制包括2个过程。
注册:将新的功能添加进系统(松散、异步的);
回调:在合适的时机使新加入的功能起作用。
基于这种机制的代码组织形式与windows里面基于消息的编程模式类似。

具体应用:
1、服务端各个子模块(d模块)统一通过
register_post_init((: do_init);

来进行本模块的初始化。调用的时机是服务端的object加载完毕,服务器启动完成之前。
2、d模块通过注册回调来组织更小的模块。如
每个子任务通过TASK_D->register_entry(get_name(), this_object());来注册自己,以使本部分的功能对外公开。
3、模块内部根据系统状态实现相应的功能,如某个功能在玩家点击npc时触发,某个功能在玩家进入特定

地图时触发……
为了使流程上更清晰,服务端定义了一些全局的状态信息(事件),通过这些接口,程序员可以方便地加入

新的功能。
实例:
以下代码实现
点击 "xxx"时,显示 "你好char_name,找我有什么事"。

...
me->register_interface(this_object(), me,
                               ([ SF_MENU         : (: call_other, __FILE__, "sf_menu_test",

me,
                                   ]));

public int sf_menu_test(object me, object npc)
{
    if (npc->get_name() != "xxx")
        // NPC不对
        return 0;

    me->send_dialog_ok(sprintf("你好#R%s#n,找我有什么事",me->get_name()));
}
...


注册回调的实现(在底层是利用函数指针实现的)
基本思路:用集合数据结构存储所有注册过的函数,在需要的时候统一调用一遍。
3种机制:
1、自己维护数组
register_post_init 的实现方法
2、register机制,便于组织代码。
3、shadow 机制
服务端通过shadow机制,支持事件触发。

实现新的事件的过程:
* 事件宏定义
* 设计事件发生的入口,可以加在客户端的命令处理逻辑中或者是d模块中
* 其他地方注册或删除回调函数。

本文写于2011年3月
分享到:
评论

相关推荐

    回调机制的实现,主要介绍回调机制的实现过程

    回调用于以下的情形: a) 发出通知,不关心通知的接受者是谁 b) 功能的使用者是一个Framework,不知道(或不关心)具体的功能的提供者是谁。如Windows系统的很多回调函数。 c) 为了防止两个模块的互相依赖,A直接...

    给初学者的java回调demo

    给初学者的java回调demo,有了这篇demo,朋友们能更好地了解java的回调机制,也能手动debug。

    RecallBackDemo(回调函数实现简单计时器)

    回调函数使用,使得代码变得部分跟不变部分更加明显,代码整体上有一个质的提升。...我是用抽象类里写的抽象回调函数,通过通知注册接口形式,可以随时传递数据,接受数据。 同时我用接口函数回调更新UI。

    设计模式Callback介绍与实例

    回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。 java回调机制: 软件模块之间总是存在着一定的接口,从调用方式上,...

    注册机制与消息机制

    注册机制在嵌入式编程中很少提到,但回调函数大家经常接触,以软件定时器为例:[图] 软件定时器设备通过函数Start把FunctionCallback作为参数传入定时器设备中保存,之后开启定时器,延时1000ms之后,定时器就会直接...

    深入理解Android之接口回调机制

    接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行。 首先解决啥是回调: 举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:...

    Java同步回调函数

    1.概述  软件模块之间总是存在着一定的接口,从...  回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知  所谓回调,是客户程序CLIENT调用服务程序SERVER中的某个函数

    clickthru.js:获取网页上任意位置的点击的回调

    clickthru.js clickthru.js提供了一种抽象的回调机制,用于在用户单击网页上的其他位置时隐藏下拉菜单和上下文菜单。注册听众首先,包含clickthru.js: < script src =" clickthru.js " > </ script > ...

    d3-dispatch:注册命名的回调并使用参数调用它们

    然后,您可以使用为这些事件注册回调: dispatch . on ( "start" , callback1 ) ; dispatch . on ( "start.foo" , callback2 ) ; dispatch . on ( "end" , callback3 ) ; 然后,您可以使用调用所有的回调开始或:...

    python回调函数用法实例分析

    本文实例讲述了python回调函数用法。分享给大家供大家参考。...回调和异步调用的关系非常紧密,通常我们使用 回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,

    asp.net Page.EnableEventValidation 属性验证服务器控件的回发和回调事件出现的错误

    .NET Framework出于安全考虑需要为服务器端控件的回发和回调事件进行注册,此事件验证机制可消除未经授权的回发请求和回调带来的风险。通过此模型,控件可在呈现期间注册其事件,然后在回发或回调期间验证这些事件。...

    SCSNotificationStore:SCSNotificationStore 是一个微型库,它为任何 Objective-C 对象提供了一种机制,可以使用块回调将其注册为通知的侦听器

    SCSNotificationStore 是一个微型库,它为任何 Objective-C 对象提供了一种机制,可以使用块回调将其注册为通知的侦听器。 为什么不直接在 NSNotificationCenter 上使用 usingBlock 方法呢? 在 ARC 下使用...

    分析JS单线程异步io回调的特性

    在这个过程中,我们在dom上绑定一个事件回调函数 比如 onclick=”doCheck()” 这个过程就是给dom元素注册了一个click 事件,并且绑定了一个事件回调函数 doCheck(). 当鼠标点击这个元素的时候,触发了事件,马上执行事件...

    百度注册机

    4.增加崩溃回调机制,防止由于单个线程崩溃导致整个程序崩溃。 v1.8 fix 2011/10/17 1.修正用户名干扰码语法检查功能的bug。 v1.8 2011/10/16 1.修正临时文件名乱码的问题; 2.修正已知的内存泄露问题; 3.修正...

    python学习之hook钩子的原理和使用

    钩子函数、注册函数、回调函数,他们的概念其实是一样的。 钩子函数,顾名思义,就是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。 1. hook函数,就是我们自己实现的函数,函数类型与挂载点匹配...

    google地图操作手册

    2. 需要注意的是里面很多地方通过消息来控制,Google地图提供了很好的消息回调机制,类GmapMgr的成员函数OnDocumentComplete通知Html加载完成,然后里面调用JavaScript函数InitMap来初始化地图和注册相关回调函数,...

    串口通信协议模块

    该串口通信协议模块大量使用函数回调机制,使用者只需在初始化时注册命令机命令处理函数即可,当然还有一个与之对应的下位机协议,会和一个使用此模块的简易flash编程器一起上传。另外,我比较懒,程序没有注释,...

    python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍

    在linux、windows等 GUI 工具包中,GUI组件都会注册回调函数用于处理组件所触发的动作,通常是注册对应的函数的函数指针。在之前关于Button的文章中提到了信号与槽的机制的使用,通过该机制可以很好的将组件的信号...

    Windows内核安全与驱动开发光盘源码

    11.3.2 注册文件系统变动回调 208 11.3.3 文件系统变动回调的一个实现 209 11.3.4 文件系统识别器 211 11.4 文件系统控制设备的绑定 212 11.4.1 生成文件系统控制设备的过滤设备 212 11.4.2 绑定文件系统控制...

    Windows内核安全驱动开发(随书光盘)

    11.3.2 注册文件系统变动回调 208 11.3.3 文件系统变动回调的一个实现 209 11.3.4 文件系统识别器 211 11.4 文件系统控制设备的绑定 212 11.4.1 生成文件系统控制设备的过滤设备 212 11.4.2 绑定文件系统控制...

Global site tag (gtag.js) - Google Analytics