栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++实现的分布式游戏服务端引擎KBEngine详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++实现的分布式游戏服务端引擎KBEngine详解

KBEngine 是一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,
使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d, HTML5, 等等)技术结合形成一个完整的客户端。

服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术,
将精力真正集中到游戏开发层面上来,快速的打造各种网络游戏。

(经常被问到承载上限,kbengine底层架构被设计为多进程分布式动态负载均衡方案,
理论上只需要不断扩展硬件就能够不断增加承载上限,单台机器的承载上限取决于游戏逻辑本身的复杂度。)

cstdkbe.hpp


#ifndef KBE_CSTDKBE_HPP
#define KBE_CSTDKBE_HPP
#include "cstdkbe/platform.hpp"
#include "cstdkbe/singleton.hpp"
#include "cstdkbe/kbeversion.hpp"
#include "cstdkbe/kbemalloc.hpp"
#include "cstdkbe/stringconv.hpp"
#include "cstdkbe/format.hpp"
 
namespace KBEngine{

#define SAFE_RELEASE(i)     
  if (i)    
    {     
      delete i;      
      i = NULL;      
    }
 

#define SAFE_RELEASE_ARRAY(i)  
  if (i)    
    {     
      delete[] i;     
      i = NULL;      
    }
 
#ifdef CODE_INLINE
  #define INLINE  inline
#else
  #define INLINE
#endif
 

extern GAME_TIME g_kbetime;
 

enum ACCOUNT_TYPE
{
  ACCOUNT_TYPE_NORMAL = 1,  // 普通账号
  ACCOUNT_TYPE_MAIL = 2,   // email账号(需激活)
  ACCOUNT_TYPE_SMART = 3   // 智能识别
};
 
enum ACCOUNT_FLAGS
{
  ACCOUNT_FLAG_NORMAL = 0x00000000,
  ACCOUNT_FLAG_LOCK = 0x000000001,
  ACCOUNT_FLAG_NOT_ACTIVATED = 0x000000002
};
 

enum ENTITY_MAILBOX_TYPE
{
  MAILBOX_TYPE_CELL   = 0,
  MAILBOX_TYPE_base   = 1,
  MAILBOX_TYPE_CLIENT  = 2,
  MAILBOX_TYPE_CELL_VIA_base     = 3,
  MAILBOX_TYPE_base_VIA_CELL     = 4,
  MAILBOX_TYPE_CLIENT_VIA_CELL    = 5,
  MAILBOX_TYPE_CLIENT_VIA_base    = 6,
};
 

const char ENTITY_MAILBOX_TYPE_TO_NAME_TABLE[][8] = 
{
  "cell",
  "base",
  "client",
  "cell",
  "base",
  "client",
  "client",
};
 

enum COMPONENT_TYPE
{
  UNKNOWN_COMPONENT_TYPE = 0,
  DBMGR_TYPE= 1,
  LOGINAPP_TYPE      = 2,
  baseAPPMGR_TYPE     = 3,
  CELLAPPMGR_TYPE     = 4,
  CELLAPP_TYPE      = 5,
  baseAPP_TYPE      = 6,
  CLIENT_TYPE= 7,
  MACHINE_TYPE      = 8,
  CONSOLE_TYPE      = 9,
  MESSAGELOG_TYPE     = 10,
  BOTS_TYPE = 11,
  WATCHER_TYPE      = 12,
  BILLING_TYPE      = 13,
  COMPONENT_END_TYPE   = 14,
};
 

extern COMPONENT_TYPE g_componentType;
extern COMPONENT_ID g_componentID;
 

const char COMPONENT_NAME[][255] = {
  "unknown",
  "dbmgr",
  "loginapp",
  "baseappmgr",
  "cellappmgr",
  "cellapp",
  "baseapp",
  "client",
  "kbmachine",
  "console",
  "messagelog",
  "bots",
  "watcher",
  "billing",
};
 
const char COMPONENT_NAME_1[][255] = {
  "unknown  ",
  "dbmgr   ",
  "loginapp  ",
  "baseappmgr ",
  "cellappmgr ",
  "cellapp  ",
  "baseapp  ",
  "client   ",
  "kbmachine ",
  "console  ",
  "messagelog ",
  "bots",
  "watcher",
  "billing",
};
 
inline const char* COMPONENT_NAME_EX(COMPONENT_TYPE CTYPE)
{    
  if(CTYPE < 0 || CTYPE >= COMPONENT_END_TYPE)
  {
    return COMPONENT_NAME[UNKNOWN_COMPONENT_TYPE];
  }
 
  return COMPONENT_NAME[CTYPE];
}
 
inline const char* COMPONENT_NAME_EX_1(COMPONENT_TYPE CTYPE)
{    
  if(CTYPE < 0 || CTYPE >= COMPONENT_END_TYPE)
  {
    return COMPONENT_NAME_1[UNKNOWN_COMPONENT_TYPE];
  }
 
  return COMPONENT_NAME_1[CTYPE];
}
 
inline COMPONENT_TYPE ComponentName2ComponentType(const char* name)
{
  for(int i=0; i<(int)COMPONENT_END_TYPE; i++)
  {
    if(kbe_stricmp(COMPONENT_NAME[i], name) == 0)
      return (COMPONENT_TYPE)i;
  }
 
  return UNKNOWN_COMPONENT_TYPE;
}
 
// 所有的组件列表
const COMPONENT_TYPE ALL_COMPONENT_TYPES[] = {baseAPPMGR_TYPE, CELLAPPMGR_TYPE, DBMGR_TYPE, CELLAPP_TYPE, 
     baseAPP_TYPE, LOGINAPP_TYPE, MACHINE_TYPE, CONSOLE_TYPE, MESSAGELOG_TYPE, 
     WATCHER_TYPE, BILLING_TYPE, BOTS_TYPE, UNKNOWN_COMPONENT_TYPE};
 
// 所有的后端组件列表
const COMPONENT_TYPE ALL_SERVER_COMPONENT_TYPES[] = {baseAPPMGR_TYPE, CELLAPPMGR_TYPE, DBMGR_TYPE, CELLAPP_TYPE, 
     baseAPP_TYPE, LOGINAPP_TYPE, MACHINE_TYPE, MESSAGELOG_TYPE, 
     WATCHER_TYPE, BILLING_TYPE, BOTS_TYPE, UNKNOWN_COMPONENT_TYPE};
 
// 所有的后端组件列表
const COMPONENT_TYPE ALL_GAME_SERVER_COMPONENT_TYPES[] = {baseAPPMGR_TYPE, CELLAPPMGR_TYPE, DBMGR_TYPE, CELLAPP_TYPE, 
     baseAPP_TYPE, LOGINAPP_TYPE, BILLING_TYPE, UNKNOWN_COMPONENT_TYPE};
 
// 所有的辅助性组件
const COMPONENT_TYPE ALL_HELPER_COMPONENT_TYPE[] = {MESSAGELOG_TYPE, UNKNOWN_COMPONENT_TYPE};
 
// 返回是否是一个有效的组件
#define VALID_COMPonENT(C_TYPE) ((C_TYPE) > 0 && (C_TYPE) < COMPONENT_END_TYPE)
 
 
// 前端应用的类别, All client type
enum COMPONENT_CLIENT_TYPE
{
  UNKNOWN_CLIENT_COMPONENT_TYPE  = 0,
 
  // 移动类,手机,平板电脑
  // Mobile, Phone, Pad(Allowing does not contain Python-scripts and entitydefs analysis, can be imported protocol from network)
  CLIENT_TYPE_MOBILE= 1,
 
  // 独立的Windows/Linux/Mac应用程序(包含python脚本,entitydefs解析与检查entitydefs的MD5,原生的)
  // Windows/Linux/Mac Application program (Contains the Python-scripts, entitydefs parsing and check entitydefs-MD5, Native)
  CLIENT_TYPE_PC  = 2,  
 
  // 不包含Python脚本,entitydefs协议可使用网络导入
  // Web, HTML5, Flash
  CLIENT_TYPE_BROWSER= 3,  
 
  // 包含Python脚本,entitydefs解析与检查entitydefs的MD5,原生的
  // bots (Contains the Python-scripts, entitydefs parsing and check entitydefs-MD5, Native)
  CLIENT_TYPE_BOTS = 4,  
 
  // 轻端类, 可不包含python脚本,entitydefs协议可使用网络导入
  // Mini-Client(Allowing does not contain Python-scripts and entitydefs analysis, can be imported protocol from network)
  CLIENT_TYPE_MINI = 5,  
 
  // End
  CLIENT_TYPE_END  = 6   
};
 

const char COMPONENT_CLIENT_NAME[][255] = {
  "UNKNOWN_CLIENT_COMPONENT_TYPE",
  "CLIENT_TYPE_MOBILE",
  "CLIENT_TYPE_PC",
  "CLIENT_TYPE_BROWSER",
  "CLIENT_TYPE_BOTS",
  "CLIENT_TYPE_MINI",
};
 
// 所有前端应用的类别
const COMPONENT_CLIENT_TYPE ALL_CLIENT_TYPES[] = {CLIENT_TYPE_MOBILE, CLIENT_TYPE_PC, CLIENT_TYPE_BROWSER, 
   CLIENT_TYPE_BOTS, CLIENT_TYPE_MINI, UNKNOWN_CLIENT_COMPONENT_TYPE};
 
typedef int8 CLIENT_CTYPE;
 
// 前端是否支持浮点数
// #define CLIENT_NO_FLOAT
 
// 一个cell的默认的边界或者最小大小
#define CELL_DEF_MIN_AREA_SIZE500.0f
 

#define SPACE_CHUNK_SIZE   100
 
 

inline bool validName(const char* name, int size)
{
  if(size >= 256)
    return false;
 
  for(int i=0; i= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch == '_'))
      continue;
 
    return false;
  }
 
  return true;
}
 
inline bool validName(const std::string& name)
{
  return validName(name.c_str(), name.size());
}
 

#ifdef USE_REGEX
#include 
#endif
 
inline bool email_isvalid(const char *address) 
{
#ifdef USE_REGEX
  std::tr1::regex _mail_pattern("([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)");
  return std::tr1::regex_match(accountName, _mail_pattern);
#endif
  int len = strlen(address);
  if(len <= 3)
    return false;
 
  char ch = address[len - 1];
  if(!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')))
    return false;
 
  int    count = 0;
  const char *c, *domain;
  static const char *rfc822_specials = "()<>@,;:\"[]";
 
  
  for (c = address; *c; c++) {
  if (*c == '"' && (c == address || *(c - 1) == '.' || *(c - 1) == 
    '"')) {
   while (*++c) {
    if (*c == '"') break;
    if (*c == '\' && (*++c == ' ')) continue;
    if (*c <= ' ' || *c >= 127) return false;
   }
   if (!*c++) return false;
   if (*c == '@') break;
   if (*c != '.') return false;
   continue;
  }
  if (*c == '@') break;
  if (*c <= ' ' || *c >= 127) return false;
  if (strchr(rfc822_specials, *c)) return false;
  }
  if (c == address || *(c - 1) == '.') return false;
 
  
  if (!*(domain = ++c)) return false;
  do {
  if (*c == '.') {
   if (c == domain || *(c - 1) == '.') return false;
   count++;
  }
  if (*c <= ' ' || *c >= 127) return false;
  if (strchr(rfc822_specials, *c)) return false;
  } while (*++c);
 
  return (count >= 1);
}
 
}
#endif // KBE_CSTDKBE_HPP

以上所述就是本文的全部内容了,有需要的小伙伴可以参考下。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/65197.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号