什么是KBEngine
本文转自:https://github.com/harmy/kbengine
什么是KBEngine?
KBEngine是一款开源mmog服务端引擎, 使用统一协议能够轻松与前端对接,能轻松使用unity3d、 ogre、 cocos2d、 html5等作为前端表现。
底层框架由c++编写, 逻辑层使用python, 开发者无需重复实现一些通用的底层服务端技术, 使开发者能够真正集中精力到游戏开发上来, 快速打造各种游戏。
(经常被问到承载上限, kbengine底层架构被设计为多进程分布式动态负载均衡方案, 理论上只需要不断扩展硬件就能够不断增加承载上限, 单台机器的承载上限取决于游戏逻辑本身的复杂度。)
简单的介绍一下引擎的各个主要组件部分:
· loginapp:
client的登录验证, 验证通过则向客户端发放一个baseapp的地址, 之后客户端通过baseapp与服务端交互。
可在多台机器部署多个loginapp进程来负载。
· dbmgr:
实现数据的存取,默认使用mysql作为数据库。
· baseappmgr:
主要负责协调所有baseapp的工作,包括负载均衡处理等。
· baseapp:
客户端与服务端的交互只能通过loginapp分配的baseapp来完成。
定时写entity的数据到数据库、 baseapp数据相互备份。
可在多台机器部署多个baseapp进程来均衡负载。
· cellappmgr:
主要负责协调所有cellapp的工作,包括负载均衡处理等。
· cellapp:
主要处理游戏实时逻辑, 如:aoi, navigate, ai, 休闲游戏房间内逻辑等等。
可在多台机器部署多个cellapp进程来动态均衡负载。
· client:
客户端我们将提供基础框架,这个框架不包括渲染部分和输入输出部分的具体实现,
我们将提供一个lib文件和一套API接口,开发者可以选择使用自己比较适合的图形渲染引擎与输入输出控制部分,
(目前已实现的ClientSDK版本: Unity3d、Ogre、Html5)
· kbmachine:
抽象出一个服务端硬件节点(一台硬件服务器只能存在一个这样的进程)。主要用途是接受远程指令处理本机上的组件启动与关闭,
提供本机上运行组件的接入口以及搜集当前机器上的一些信息,
如:CPU, 内存等。 这些信息会提供给一些对此比较感兴趣的组件。
· guiconsole:
这是一个控制台工具, 可以实时的观察服务端运行状态, 实时观测不同space中entity的动态,
并支持动态调试服务端python逻辑层以及查看各个组件的日志,启动服务端与关闭等。
· messagelog:
收集和备份各个组件的运行日志,可使用guiconsole来查看和搜索相关信息。
GO!
设置环境变量:
kbe会读取KBE_ROOT,KBE_RES_PATH, KBE_HYBRID_PATH系统环境变量来做一些事情。
Linux: (假设kbe被放置在~/目录下)
[kbe@localhost ~]# vim ~/.bashrc
ulimit -c unlimited
export KBE_ROOT=~/kbengine/
export KBE_RES_PATH=$KBE_ROOT/kbe/res/:$KBE_ROOT/demo/:$KBE_ROOT/demo/res/
export KBE_HYBRID_PATH=$KBE_ROOT/kbe/bin/Hybrid64/
[root@localhost ~]# vim /etc/passwd
修改系统账号的uid必须唯一, uid用来区分不同的服务端组, 如果二台硬件维护一组服务端那么二台硬件上的uid必须一致,
值需大于0。
Windows:
鼠标右键"我的电脑"->"高级"->"环境变量" 设置对应的值就好了。
设置以下环境变量
KBE_ROOT ~/kbengine/(注意:这个地方应该是输入你kbengine所在的目录路径)
KBE_RES_PATH $KBE_ROOT/kbe/res/:$KBE_ROOT/demo/:$KBE_ROOT/demo/res/
KBE_HYBRID_PATH=$KBE_ROOT/kbe/bin/Hybrid64/
(注意: Windows下需要在环境变量中添加UID, 值需大于0)
KBE_ROOT:
kbe根目录路径。
KBE_RES_PATH:
相关资源路径用':'或者';'分隔, 第一个res必须是kbe引擎的res, 第二个res必须是用户脚本根目录, 其他无限制。
KBE_HYBRID_PATH:
kbe二进制文件所在目录路径。
编译:
linux:
测试系统(x32&x64): centos >= 5.x, debian >= 5.x
编译器 gcc: >= 4.4.x
[root@localhost ~]# cd $KBE_ROOT/kbe/src
[root@localhost /src]# make
windows:
安装好vc2008sp1版本直接编译完即可
KBE_ROOT\kbengine\kbe\src\kbengine_vs90.sln
注意:
1: 如使用其他版本编译器最好将openssl、log4cxx(kbe\src\libs\*.a)也重新编译。
2: 某些平台上的mysql路径可能不是/usr/lib64/mysql/mysql_config
修改kbe\src\build\common.mak中的MYSQL_CONFIG_PATH=/usr/lib64/mysql/mysql_config
3: 在linux上编译完成如因为python无法初始化无法正常运行的情况(这是个bug http://bugs.python.org/issue11320):
cd src\lib\python
./configure
make
make install
再启动服务端。
配置数据库:
1: 安装好mysql
如果是windows系统则my.ini中加入如下代码使mysql大小写敏感
[mysqld]
lower_case_table_names=0
2: 记得重启mysql服务, 否则不生效(命令行cmd输入):
net stop mysql
net start mysql
3: 新建一个数据库, 假设数据库名为"kbe"
mysql> create database kbe;
4: 创建一个数据库账户, 假设用户名密码都为"kbe"
先删除匿名用户
mysql> use mysql
mysql> delete from user where user='';
mysql> FLUSH PRIVILEGES;
创建kbe用户
mysql> grant all privileges on *.* to kbe@'%' identified by 'kbe';
mysql> grant select,insert,update,delete,create,drop on *.* to kbe@'%' identified by 'kbe';
mysql> FLUSH PRIVILEGES;
在CMD中测试一下是否能使用这个账号登陆mysql(请注意默认mysql端口为3306, 如不一致请修改kbengine_defs.xml->dbmgr-><port>330x</port>),
如果没有提示错误则账号配置完毕, 有错误请google
进入你的mysql安装目录找到mysql.exe所在目录, 然后cmd进入这个目录中执行如下语句:
C:\mysql\bin> mysql -ukbe -pkbe -hlocalhost -P3306
5: 在res\server\kbengine_defs.xml的dbmgr节修改databaseName参数
(推荐在demo\res\server\kbengine.xml重载修改)。
如果mysql端口不是3306, 请在kbengine.xml中的dbmgr段加入<port>端口号</port>。
启动服务端:
Linux:
[root@localhost ~]# cd $KBE_HYBRID_PATH
sh start.sh
sh kill.sh
(注意: 如有防火墙限制请设置防火墙规则对外开放这些TCP端口: loginapp登录端口、 baseapp登录端口具体请看
kbengine.xml|kbengine_defs.xml。 以及UDP广播端口:20086-20088)
(注意: 如果有二块网卡, 例如: eth0(公网ip)、eth1(局域网ip)
请设置kbengine.xml|kbengine_defs.xml除baseapp|loginapp|billingsystem的externalInterface设置为eth0以外,
其他相关{internal|external}Interface为局域网ip的那块网卡(eth1), 并设置使用局域网ip来接收udp广播:
/sbin/ip route del broadcast 255.255.255.255 dev eth0
/sbin/ip route add broadcast 255.255.255.255 dev eth1
)
Windows:
cd KBE_HYBRID_PATH
!(win)fixedstart.bat
!(win)kill.bat
或者使用tools\server\guiconsole\guiconsole.exe来启动和关闭服务端。
(注意: Windows版本仅用于测试, 由于使用select并发socket处理性能有限。)
日志:
KBE_HYBRID_PATH目录下会产生各组件运行的日志信息"logs\*.log"。
也可以使用GUIConsole来查看, 但必须开启messagelog。
什么是KBEngine的更多相关文章
- kbengine里如何使用git快速下载项目?
项目有两个镜像,github[https://github.com/kbengine/kbengine.git] ,osc开源中国[https://git.oschina.net/likecg/kbe ...
- kbengine mmo源码(完整服务端源码+资源+完整客户端源码)
本项目作为kbengine服务端引擎的客户端演示而写 更新kbengine插件库(https://github.com/kbengine/kbengine_unity3d_plugins): ...
- kbengine Unity3d demo 代码执行流程(4)
当服务端成功启动,客户端链接服务端后进入demo中的游戏界面,demo中的功能包括注册.登录.角色管理.战斗.场景等等. 对于新接触kbengine的人,看见客户端的代码后会觉得很迷茫,有些无从下手. ...
- kbengine FAQ(3)
官方FAQ 下面是我遇到的一些问题: 1.服务端 "strtof" 未定义的标示符 对于我这个c++入门级都不算的新手,这个错误很挠头,这个错误是由于vc++版本问题,新版的语 ...
- kbengine环境搭建(2)
做好准备工作后,可以开始搭建我们的kbengine服务端,运行成功kbengine服务端,共有9个服务会相应的被打开,并会全部提示[info]found all components! 准备工作 1. ...
- kbengine简单介绍(1)
什么是kbengine? 一款开源的游戏服务端引擎,客户端通过简单的约定协议就能与服务端通讯, 使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d-x, HTML5, 等 ...
- KBEngine WebConsole Guide
https://github.com/kbengine/kbengine/tree/master/docs
- KBEngine简单RPG-Demo源码解析(3)
十四:在世界中投放NPC/MonsterSpace的cell创建完毕之后, 引擎会调用base上的Space实体, 告知已经获得了cell(onGetCell),那么我们确认cell部分创建好了之后就 ...
- KBEngine简单RPG-Demo源码解析(2)
七:服务端资产库文件夹结构http://kbengine.org/cn/docs/concepts/directorys.html看assets, 注意:demo使用的不是默认的assets资产目录, ...
- KBEngine简单RPG-Demo源码解析(1)
一:环境搭建1. 确保已经下载过KBEngine服务端引擎,如果没有下载请先下载 下载服务端源码(KBEngine): https://github.com ...
随机推荐
- Oracle判断两个时间段是否相交
SQL中常常要判断两个时间段是否相交,该如何判断呢?比如两个时间段(S1,E1)和(S2,E2).我最先想到的是下面的方法一.方法一:(S1 BETWEEN S2 AND E2) OR (S2 BET ...
- HQL语句中数据类型转换,及hibernate中createQuery执行hql报错
一.HQL语句中数据类型转换: 我们需要从数据库中取出序号最大的记录,想到的方法就是使用order by子句进行排序(desc倒序),然后取出第一个对象,可是当初设计数据库时(我们是在原来的数据库的基 ...
- Perforce查看workspace sync到的changlist
一 查看workspace sync到的changelist perforce的workspace其实是一些特定版本的文件的 结合,相比只将workspace对应到某个特定的changelist,此方 ...
- (转)intellij idea svn 修改文件后,父文件夹也标注修改
svn文件修改后,默认只有当前文件更改而父文件没有标注,很不直观:查了一顿后,发现,可以设置: File—->settings—->version control—–>勾选show ...
- JAVA简单选择排序算法原理及实现
简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...
- MyEclipse8.0 注册码生成代码
转自:http://blog.sina.com.cn/s/blog_7ad29e00010199xt.html package com.guaicaicc.register; import java. ...
- Ubuntu切换root用户权限
其实方法很简单,就是需要选对自己使用的linux系统,不同分支的系统切换root的方法不一定一样. Ubuntu切换root的方法很简单,首先一档钱管理员命令执行: sudo passwd root ...
- NestedScrollView嵌套RecyclerView
天气渐寒,然学习不可懈怠,记录一下使用NestedScrollView嵌套RecyclerView的两个问题,以后遇到可以来这里温故. 应该说在MD中,RecyclerView代替了ListView, ...
- [Java - 调用WebService]{http://schemas.microsoft.com/ws/2005/05/addressing/none}ActionNotSupported
- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipar ...
- Swift的String与OC的NSString的区别
Swift的String类型是值类型.如果你创建了一个新的字符串值,那么当其进行常量.变量赋值操作或在函数/方法中传递时,会进行值拷贝. 在不同的情况下,都会对已有字符串值创建新的副本,并对该新副本进 ...