C++完成的散布式游戲辦事端引擎KBEngine詳解。本站提示廣大學習愛好者:(C++完成的散布式游戲辦事端引擎KBEngine詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++完成的散布式游戲辦事端引擎KBEngine詳解正文
KBEngine 是一款開源的游戲辦事端引擎,應用簡略的商定協定就可以夠使客戶端與辦事端停止交互,
應用KBEngine插件可以或許疾速與(Unity3D, OGRE, Cocos2d, HTML5, 等等)技巧聯合構成一個完全的客戶端。
辦事端底層框架應用c++編寫,游戲邏輯層應用Python(支撐熱更新),開辟者無需反復的完成一些游戲辦事端通用的底層技巧,
將精神真正集中到游戲開辟層面下去,疾速的打造各類收集游戲。
(常常被問到承載下限,kbengine底層架構被設計為多過程散布式靜態負載平衡計劃,
實際上只須要赓續擴大硬件就可以夠赓續增長承載下限,單台機械的承載下限取決於游戲邏輯自己的龐雜度。)
cstdkbe.hpp
/*
This source file is part of KBEngine
For the latest info, see http://www.kbengine.org/
Copyright (c) 2008-2012 KBEngine.
KBEngine is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
KBEngine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with KBEngine. If not, see <http://www.gnu.org/licenses/>.
*/
#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
/** kbe時光 */
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
};
/** entity的mailbox種別 */
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,
};
/** mailbox的種別對調為字符串稱號 嚴厲和ENTITY_MAILBOX_TYPE索引婚配 */
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,
};
/** 以後辦事器組件種別和ID */
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_SIZE 500.0f
/** 一個空間的一個chunk年夜小 */
#define SPACE_CHUNK_SIZE 100
/** 檢討用戶名正當性 */
inline bool validName(const char* name, int size)
{
if(size >= 256)
return false;
for(int i=0; i<size; i++)
{
char ch = name[i];
if((ch >= '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());
}
/** 檢討email地址正當性
嚴厲婚配請用以下表達式
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
*/
#ifdef USE_REGEX
#include <regex>
#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 = "()<>@,;:\\\"[]";
/* first we validate the name portion (name@domain) */
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;
/* next we validate the domain portion (name@domain) */
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
以上所述就是本文的全體內容了,有須要的小同伴可以參考下。