游戏后台里的通用技术之异步处理和回调

手游联运系统后台有什么功能?后台功能大全! 手游联运系统后台功能大全,全网最全完整版! 阅读详情

.什么是回调函数?
回调在不用的语言可以用不同的实现手法,比如C/C++一般使用函数指针,C#这类没有指针的语言可以使用委托,回调的本质上是先用函数指针存储函数
的地址,在处理完某个事件/或者满足某个条件的时候调用函数来处理。


2.为什么需要回调了?
在game后台很多处理需要异步的经行,这样才能保证后台程序的高效性。既然需要异步处理,那就是在某个时间点后或者满足某个条件后调用预先指定的函


数。这个就叫做回调。


3.如何设计一个通用的回调架构


从需求开始:
假想一个场景需求我们要异步处理对DB的数据处理,比如查询,修改数据都必须是异步的(使用SQL对db的查询一般是同步过程,也就是你select或者insert


的时候如果数据没有返回,这时候是不能接着处理下面的语句的,想象下在一个要处理几千玩家的服务器这绝对是不予需的)。那么如何设计了?
接着往下看。




//先的有一个抽象基类,提供一个回调接口run()函数,这样利用多态在调用run的时候,会根据实际的子类对象调用到子类的run
struct runnable
{

   virtual void run() = 0;

   virtual ~runnable() {};

};

////具体实现 callback.h

#ifndef __CALLBACK_H_
#define __CALLBACK_H_
//#include ""

struct runnable
{
  virtual ~runnable() {};
  virtual void run() = 0;  //回调接口
};


template <typename FUN>
class CCallFun0 : public runnable
{
public:
    CCallFun0(FUN fun) { m_fun = fun; }
    virtual void run() 
    {
        m_fun();
    }
private:
    FUN m_fun;
};

template<typename FUN,typename PAR>
class CCallFun1:public runnable
{
public:
    CCallFun1(FUN fun,PAR par)
        :m_fun(fun) 
        ,m_par(par)
    {}
    virtual ~CCallFun1() {};
    virtual void run() 
    {
        m_fun(m_par);
    }
private:
    FUN  m_fun;
    const PAR  m_par;
};

template<typename FUN,typename PAR1,typename PAR2>
class CCallFun2:public runnable
{
public:
    CCallFun2(FUN fun,PAR1 par1,PAR2 par2)
        :m_fun(fun),
        m_par1(par1),
        m_par2(par2)
    {}
    
    virtual void run() 
    {
        m_fun(m_par1,m_par2);
    }

private:
    FUN m_fun;
    const PAR1 m_par1;
    const PAR2 m_par2;
};

#endif





////测使用 


#include "CallBack.h"
void test(int index)
{
    std::cout << index;
}


void strtest(std::string str)
{
    std::cout << str;
}


template < typename FUN, typename PARA >
inline runnable * make_fun_runnable(FUN fun, PARA para)
{
    return new CCallFun1<FUN, PARA>(fun, para);
}


int _tmain(int argc, _TCHAR* argv[])
{
    runnable* runbale = make_fun_runnable(test,5);
    runbale->run();


    runbale = make_fun_runnable(strtest,"ABCD");
    runbale->run();


return 0;
}


根据参数个数不同,可以模仿上面增加类来支持


//那么在DB的查询中如何异步来使用了 大概流程如下


定义回调函数 比如加载玩家信息


void LoadRoleInfoFromDB(int roleid, dataset * data)
{
   //dataset为db查询的返回结果,根据实际情况类型会不同 
   //如mysql的 dataset可能为 ::mysqlpp::StoreQueryResult
   //伪代码如下
   CPlayer* player = GetPlayer(roleid); 
   if (player == NULL)
   {
       return;
   }
   struct playerinfo info; 
   //一般会把DB的信息解码成自定义结构体
   Encode(data,info);
   player->SetInfo(data); 
} 


//某个Role的请求查询伪代码


runnable* runbale = make_fun_runnable(LoadRoleInfoFromDB,player->getroleid());  
//放入异步队列
SQLQUEUE->PushQueue(SQL,runbale);  //push到队列后


////异步处理队列
在处理完毕后
dataset  data //查询到的结果
//这个地方需要修改下,让run可以接受参数 
//run里就调用LoadRoleInfoFromDB(roleid,data);
runbale->run(data); 


当然还可以用在更多场景,

比如在一个定时器里在一个时间间隔内调用回调函数

待续




JS异步:执行原理与回调 JS异步:执行原理与回调一、JS异步的执行原理二、JS异步中的回调 一、JS异步的执行原理   我们知道JavaScript是单线程的,而浏览器是多线程的。单线程执行任务需要一个个排队进行,假如一个任务需要很长时间执行(像ajax需要较长时间),会直接导致无响应,后面的任务一直在等待执行。这时候就需要用到异步。   想了解异步,首先我们要知道浏览器有最基本的三个常驻线程: JS引擎线程,事件触发线程,GUI渲染线程。   其中JS引擎线程和事件触发线程共同构成了一种事件循环机制,而GUI渲染线程与JS引 阅读详情

相关推荐

游戏后台架构发展历史及展望

综述 本文探究了游戏后台架构的发展历史及展望。随着技术的进步,游戏需求的变化,游戏架构也在不断发生变化来满足越来越高的游戏需求。总体来说是需求在推动着架构的变化。本文最后也根据现在人们的游戏需求和现在业界技术情况,给出了后台架构展望。 游戏后台架构发展历史 第一代网游服务器 最早的游戏服务器是1978年,英国著名的财经学校University of Essex的学生 Roy Tru...

Wesley's Blog 7822

Unity——异步方法

异步方法和同步方法的区别 同步方法: 方法中逻辑执行完毕后,再继续执行后面的方法 异步方法: 方法中逻辑可能还没有执行完毕,就继续执行后面的内容 异步方法的本质: 往往异步方法当中都会使用多线程执行某部分逻辑 因为我们不需要等待方法中逻辑执行完毕就可以继续执行下面的逻辑了注:unity中的协同程序中的某些异步方法,有的使用的是多线程有的使用的是迭代

m0_51743362的博客 6714

steam游戏上架流程四:Steamworks SDK 的API 方法回调方式 ( Callback )

unity项目上线steam平台,若是接入steamworks SDK可以提供更好的体验。steam官方提供的SDK都是C++代码,也可以选择sdk接入时找到别人用C#封装的原生steamworks SDK,官方链接:https://steamworks.github.io/。上述链接包含文档及sdk下载地址。 下载 Steamworks.NET的.unitypackagehttps://g...

Peter的博客 9528

游戏后台管理工具帮助文档

游戏后台管理工具帮助文档

ydc4399的博客 4631

手游充值问题全套解决方案

手游充值问题全套解决方案,欢迎下载!这里有相关案例

安卓ai自动化脚本 Yyds.Auto实现 示例 纯ai图像识别自动点击脚本

纯ai识别实现自动化脚本

专注安卓前沿科技 4784

游戏微服务架构设计:异步回调

在处理客户端请求时,需要立即返回,把一些工作交给后台线程执行时,就会需要用到异步回调。 在node.js中使用async很美,例如: async.waterfall([ function(callback) { callback(null, 'one', 'two'); }, function(arg1, arg2, callback) { //...

weixin_43465618的博客 567

【自由谈】城域网IPv6过渡技术——MAP技术(1)

在IPv4向IPv6网络演进的浪潮中,存在着两对主要矛盾的较量,一对是IPv4地址短缺和IPv4业务蓬勃发展之间的矛盾,另一对是IPv6海量的地址空间和IPv6应用的匮乏之间的矛盾。同时两对矛盾又互相制约,IPv4地址共享机制似乎又减缓了IPv6产业链的发展,IPv6产业链的不断发展似乎又在考验着IPv4地址共享机制的部署规模。MAP成为目前兼顾IPv4和IPv6的4voer6场景中最为关注的技术。

韩立金自由谈 3024

游戏开发中,回调机制和事件机制的灵活运用

在游戏开发中,回调机制和事件机制是我们解耦比较常用的设计。但各有各的优点,下面我就说一下我个人的一些见解吧。 回调机制的简单的理解: ⑴定义一个回调函数; ⑵在初始化的时候,将回调函数注册给调用者; ⑶当特定的事件或条件发生的时候,调用者调用该回调函数进行处理。 事件机制的简单的理解: ⑴使用者绑定对应事件; ⑵当特定的事件或条件发生的时候,触发者派发事件给管理者;

canglangclient的博客 3550

verilog实现步进电机脉冲分配器(三相六拍)基于Nexys4DDR开发板

使用Verilog HDL设计的一个能够自启动、具有正反转功能的三相六拍步进电机脉冲分配器。已经写好Nexy4DDR的管脚约束文件 可以通过Nexys4DDR开发板的PMOD接口连接步进电机进行调试。 使用verilog语言 在vivado2018.2下运行编译下载都正确,(也可在ISE,QuartusII下使用)下面是工程截图: ...

QQ_778132974的博客 2593

【AUTOSAR SystemServices】AUTOSAR CP中Watchdog Manager模块技术解析

本文深入解析了AUTOSAR中的Watchdog Manager模块实现。该模块通过多层次监督机制(Alive/Deadline/Logical Supervision)确保系统安全运行,具备动态模式切换和分级故障处理能力。 关键实现包括: 数据结构设计:包含监督实体状态结构体(实时状态维护)、监督配置结构体(支持模式切换)和全局状态信息(系统级监控) 核心流程优化:初始化采用事务性设计,检查点处理通过条件编译优化,主监控循环采用流水线式并行处理 监督机制实现:Alive监督采用滑动窗口算法,Deadlin

1039

java异步回调历程

java I/O的经历了BIO(Blocking IO),NIO(Non-blocking IO),AIO(Async-I/O),这些IO技术的发展都是依托已java版本的更新。 本文主要研究一下java的异步回调机制, 主要针对juc包下的Future,Callable,FutureTask,更多关于java I/O历程。 业务场景 假定我们有这样一个业务场景,烧一壶开水,烧一...

dark 3516

【原理图PCB专题】Cadence 17.4版本导出excel版本坐标文件

Cadence 17.4版本导出坐标文件往往都是txt格式,并且无标题、导出时间、导出设计工程多名称等信息。那么怎么样才能导出有带这些信息的excel版本并格式好看的坐标文件呢?

一点硬件 2764

CompletableFuture使用场景和实现原理,java异步回调

如果使用下面的代码等待多任务完成。问题一是执行future1.get();时主线程是堵塞的,因此future2.get();future3.get();都不会执行需要等待future1先得到返回值,也就是说会加上多余的堵塞时间。虽然任务是异步的(的确任务已经完成了,但是线程没有交还线程池)而我们希望的是对于提前完成任务的线程将他交还给线程池,让它可以再次被其它任务执行例如future1耗时4s,future2耗时3秒,future3耗时5s。如果是直接下面代码,则会导致future2在3秒的时。......

鹏神丶明月天 2224

[cshell]个性化配置你的cshrc/tcshrc

本文介绍了csh/tcsh shell的配置优化方法,主要包括:1. 配置文件管理(全局和个人配置);2. 按键绑定设置(解决远程登录按键问题);3. 提示符个性化(包含颜色配置方案);4. 环境变量设置(如LSCOLORS、CLICOLOR等);5. 安全防护措施(防误删、防覆盖等);6. 实用alias命令集(简化操作、提高效率)。文章提供了详细的配置示例,并建议通过man tcsh获取更多帮助信息。这些配置能显著提升shell使用体验和工作效率。

元直的博客 6117

Debezium报错处理系列之第112篇:Cannot replicate because the master purged required binary logs. Replicate the

Debezium报错处理系列之第112篇:Cannot replicate because the master purged required binary logs.

zhengzaifeidelushang的博客 727

从回调地狱到协程天堂:C++异步IO的进化之路——基于C++20,Boost.Asio的实践

通过异步 I/O,程序可以在等待 I/O 操作完成的同时,执行其他计算任务,从而提高 CPU 利用率和程序的整体吞吐量。IOCP 服务线程的处理: IOCP 服务线程(即运行 io_context.run() 的线程)会从完成队列(非 IOCP 服务线程情况)或内部任务队列(IOCP 服务线程情况)中取出完成通知,并在 io_context 的上下文中执行对应的完成处理程序。没有高效的 I/O 机制,应用程序将寸步难行。阻塞式 I/O 的瓶颈: 传统的 I/O 操作(如文件读写、网络请求)通常是阻塞的。

weixin_73404922的博客 1598

ESP8266-Arduino网络编程实例-异步TCP客户端

本次实例将使用ESPAsyncTCP库实现一个简单的客户端。

视觉与物联智能 1741

使用croutine处理 客户端的异步回调

function :test() local event_manager = {__eventList = {}}   function event_manager:on(event,func) self.__eventList[event] = func end function event_manager:post(event,...) local func = self.__e...

fhqydidxil1zql的专栏 337

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SteamKit2高级特性:异步作业管理、回调机制和异常处理

SteamKit2是一个强大的.NET库,专门用于与Valve的Steam网络进行互操作。它为开发人员提供了简单而可扩展的接口来执行各种网络操作。本文将深入探讨SteamKit2的三个核心高级特性:异步作业管理、回调机制和异常处理,帮助您更好地理解和应用这个强大的工具。 ## 🔄 异步作业管理机制 SteamKit2的异步作业管理是其最强大的功能之一。通过[AsyncJobManager](

gitblog_00077的博客 848

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java模拟异步消息的发送和回调

一代码 1接口 /** * Copyright (C), 2020-2020, 软件公司 * FileName: CallBack * Author: cakin * Date: 2020/4/25 * Description: 回调接口 */ package asymsg; /** * @className: CallBack * @description: 回调接...

实践求真知 459

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

彻底搞懂同步与异步:调用与回调

《用餐厅故事讲透同步与异步编程》摘要 本文通过餐厅点餐的生动比喻,将编程中的同步/异步调用与回调概念具象化。同步调用如同顾客站着等汉堡做好;异步调用则是顾客点完餐先去干别的事;同步回调是顾客站着等待厨师做好后喊一声;异步回调则是顾客留下电话,厨师做好后打电话通知。文章用C++代码对应每个场景,并制作对比表总结四者的核心差异:同步方式需要等待且效率低,异步方式则能充分利用时间。最后指出实际应用中需要注意线程安全和事件循环等细节,强调编程本质是对现实世界的逻辑模拟。这种生活化讲解方式让抽象概念变得直观易懂。

大四在找工作,如果公司有需要的可以联系我13086825462@163.com 1595

java 回调函数_java回调函数-异步回调-简明讲解

java回调函数-异步回调-简明讲解叙言:异步回调常用于某些业务需要很长时间处理,但是又需要立刻返回结果,这种情况都需要开辟线程独立处理需要长时间多的业务,也无处理完了,回调回调函数,再去处理与之有关的需要在该业务之后处理的业务。之前看到网上说的回调,虽然有很多说明,但是还是不太好理解,而且比较繁复,个人感觉做的说明并不实用,故而才有了写这篇文的想法,希望拙见能够帮助到看此文的你。1、网上有很多回...

weixin_30866939的博客 327

阻塞从何而来?阻塞和异步回调的实现

阻塞与否是由系统调用决定的。OS会根据调用函数的参数来决定它是阻塞的还是异步的。如果一个调用函数接受一个回调函数作为参数,那么这个调用就是异步的,因为当操作完成后,OS会调用这个回调函数来通知结果。如果一个调用函数不接受回调函数作为参数,那么这个调用就是阻塞的,因为当操作完成后,OS会返回一个结果,而不是调用回调函数。

qq_43631306的博客 550

Unity异步音频处理:UniTask实现音效的后台混合

在Unity开发中,音频处理往往成为性能瓶颈——当游戏需要同时播放多个音效、进行实时混音或处理音频数据时,传统同步处理方式容易导致帧率波动。本文将展示如何使用UniTask库实现音频处理的异步化,通过后台线程执行混音计算,避免主线程阻塞。 ## 异步音频处理的核心挑战 传统Unity音频工作流中,`OnAudioFilterRead`方法在主线程每帧执行,直接操作音频数据数组。当处理复杂混音算...

gitblog_00285的博客 512

Steamworks.NET 回调系统详解:如何处理 Steamworks 异步事件和响应

Steamworks.NET 是 Valve Steamworks API 的 C# 包装器,专为 Unity 和 C# 应用程序设计,提供了完整的 Steamworks 回调系统来处理异步事件和响应。这个强大的回调机制是连接你的游戏与 Steam 平台的关键桥梁,让你能够实时接收来自 Steam 的各种通知和状态更新。 ## 🔄 Steamworks.NET 回调系统架构解析 Steamw

gitblog_00874的博客 421
上一篇: 哈希表
下一篇: 时间和game后台
soft2967
博客等级 码龄15年 106粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值