簡介
KBEngine是一款開源的游戲服務端引擎,使用簡單的約定協(xié)議就能夠使客戶端與服務端進行交互,使用KBEngine插件能夠快速與(Unity3D, OGRE, Cocos2d, HTML5, 等等)技術結合形成一個完整的客戶端。
配置編譯方法
配置編譯環(huán)境
安裝依賴包。
yum install gcc-c++ autoconf automake libtool mysql-devel apr apr-devel apr-util apr-util-devel wget -y
獲取源碼
獲取“kbengine-2.5.2”源碼包。
cd /usr/local/srcwget https://github.com/kbengine/kbengine/archive/v2.5.2.tar.gz -O kbengine-2.5.2.tar.gz
編譯和安裝
步驟1: 執(zhí)行如下命令,解壓軟件包。
tar -zxvf kbengine-2.5.2.tar.gz
步驟2 :執(zhí)行如下命令,進入目錄。
cd kbengine-2.5.2/kbe/src
步驟3 : 執(zhí)行如下命令,編譯源碼。
make -j4
運行和驗證
1.安裝MySQL 數(shù)據(jù)庫 。
參考《鯤鵬生態(tài)_mysql使用指南》安裝MySQL。若已經安裝,則可以跳過此步驟。
2.啟動MySQL數(shù)據(jù)庫。
a. root用戶登錄MySQL數(shù)據(jù)庫,輸入安裝時設置的root用戶密碼,如圖1-1所示。
圖1-1 登錄MySQL數(shù)據(jù)庫

b. 執(zhí)行如下命令,創(chuàng)建kbengine引擎需要的數(shù)據(jù)庫和用戶名。
說明:
下面命令中的“password”請根據(jù)實際情況替換。
create database kbe;
use mysql;
delete from user where user='';
FLUSH PRIVILEGES;
grant all privileges on *.* to kbe@'%' identified by 'password';
grant select,insert,update,delete,create,drop on *.* to kbe@'%' identified by 'password';
FLUSH PRIVILEGES;
c. 驗證是否可以登錄。
說明:
下面命令中的“password”請根據(jù)實際情況替換。
mysql -ukbe -ppassword -hlocalhost -P3306
若顯示如圖1-2所示,則表示kbe數(shù)據(jù)庫和用戶名創(chuàng)建成功。
圖1-2 創(chuàng)建數(shù)據(jù)庫成功

3. 上傳kbengine引擎demo。
a.安裝git。
yum install git
demo獲取路徑為:
https://github.com/kbengine/kbengine_stresstest
b.下載demo到根目錄“kbengine-2.5.2”下,如圖1-3所示。
git clone https://github.com/kbengine/kbengine_stresstest.git
圖1-3 下載demo

c.將demo文件server_assets拷貝到目錄kbengine-2.5.2下。
cp -r kbengine_stresstest/mmorpg/server_assets kbengine-2.5.2
d. ifconfig查看引擎部署節(jié)點的 ip地址 。
e.修改demo配置文件。
cd kbengine-2.5.2/server_assets/res/servervim kbengine.xml
將數(shù)據(jù)庫信息修改為如下:
說明:
“password”請根據(jù)實際情況替換。
<databaseInterfaces>
<default>
<!-- <host> localhost </host> -->
<!-- <databaseName> kbe </databaseName> -->
<host> 192.168.1.237 </host>
<port> 3306 </port>
<auth>
<username> kbe </username>
<password> password </password>
<encrypt> true </encrypt>
</auth>
</default>
</databaseInterfaces>
f. 修改機器人登錄IP,為引擎部署節(jié)點IP,如圖1-4所示。IP地址可用ifconfig查看。
圖1-4 修改登錄IP

g. 返回server_assets目錄執(zhí)行啟動腳本,如圖1-5所示。
sh start_server.sh
圖1- 5 執(zhí)行啟動腳本

h. 查看進程是否啟動正常,如圖1-6所示。
ps -ef | grep kbe
圖1-6 查看進程啟動狀態(tài)

4.最后執(zhí)行python監(jiān)控腳本查看游戲場景和實體是否創(chuàng)建完成,如圖1-7所示。
實體數(shù)達到4544即可執(zhí)行機器人進行壓測。
python ../kbe/tools/server/pycluster/cluster_controller.py
圖1-7 查看創(chuàng)建情況

5.機器人壓測。
拷貝demo到另一個主機上并同引擎一樣配置“kbengine.xml”文件,ip地址仍然填寫引擎部署ip。
然后返回server_assets目錄執(zhí)行sh start_bots.sh壓測腳本。
在服務端腳本上面查看機器人登錄情況,如圖1-8所示。多次執(zhí)行sh start_bots.sh即可完成壓測,每次默認800個機器人登錄。
圖1-8 查看機器人登錄情況

參考資料
kbengine下載參考地址:https://github.com/kbengine/kbengine/releases/tag/v2.5.2
jemalloc下載參考地址:https://github.com/jemalloc/jemalloc/releases
2. 故障排除
問題一:編譯過程出現(xiàn)m32問題
現(xiàn)象描述:
編譯過程出現(xiàn)m32問題,如圖2-1所示。
圖2-1 m32 問題

問題二:編譯過程出現(xiàn)expat無法識別錯誤
現(xiàn)象描述:
在編譯expat提示當前編譯類型無法找到,如圖2-2所示。
圖2-2 無法識別

可能原因:
自帶“config.guess”版本不匹配。
解決方法一:指定平臺,手動編譯。
cd lib/dependencies/expat/
./configure --build=arm-linux
make
cd -
make -j4
解決方法二:替換expat自帶“config.guess”。
cd lib/dependencies/expat/
mv conftools/config.guess conftools/config.guess.bak
cp /usr/share/automake-1.13/config.guess conftools/
cd -
make -j4
說明:如果沒有automake請通過yum install automake,本次測試環(huán)境使用的是automake-1.13版本。
問題三:編譯過程出現(xiàn)log4cxx無法識別錯誤
現(xiàn)象描述:
在編譯log4cxx提示當前編譯類型無法找到,如圖2-3所示。
圖2-3 無法找到編譯類型

可能原因:
問題原因同上。
解決方法一:指定平臺,手動編譯。
cd lib/dependencies/log4cxx/
./configure --build=arm-linux --with-apr=../apr --with-apr-util=../apr-util
make
cd -
make -j4
解決方法二:替換log4cxx自帶“config.guess”。
cd lib/dependencies/log4cxx/
mv config.guess config.guess.bak
cp /usr/share/automake-1.13/config.guess .
cd -
make -j4
問題四:匯編代碼跨平臺支持問題
現(xiàn)象描述:
匯編代碼跨平臺支持問題,如圖2-4顯示。
圖2-4 跨平臺支持問題

可能原因:
由于ARM架構中,沒有timestamp_rdtsc函數(shù)中使用的寄存器,需修改函數(shù)實現(xiàn)。
處理步驟:
將“lib/common/timestamp.h”中的timestamp_rdtsc()函數(shù),替換為如下代碼:
inline uint64 timestamp_rdtsc()
{
#if defined(__x86_64__) || defined(__amd64__)
uint32 rethi, retlo;
__asm__ __volatile__(
"rdtsc":
"=d" (rethi),
"=a" (retlo) );
return uint64(rethi) << 32 | retlo
#elif defined(__aarch64__)
int64_t virtual_timer_value;
asm volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer_value));
return virtual_timer_value;
#else
#error "not support"
#endif
}
問題五:jemalloc ARM平臺兼容性問題
現(xiàn)象描述:
說明:
kbengine 2.5.2版本已集成jemalloc 5.2.0版本,可跳過此問題。
kbengine內置的jemalloc版本如果低于v5.2.0版本,該版本在ARM運行會出現(xiàn)段錯誤,如圖2-5所示。該問題在jemalloc v5.2.0版本已解決。
圖2-5 兼容性問題

可能原因:
本文檔采用的是jemalloc 5.2.0版本。
處理步驟:
查看kbengine當前集成的jemalloc 版本號。
vi lib/dependencies/jemalloc/ChangeLog
如果版本號低于5.2.0版本,則下載jemalloc 5.2.0及以上版本,并進行重新編譯。
下載jemalloc 5.2.0及以上版本,并進行重新編譯。
cd lib/dependencies/
mv lib/dependencies/jemalloc lib/dependencies/jemalloc_back
wget https://github.com/jemalloc/jemalloc/archive/5.2.0.tar.gz
tar xvf 5.2.0.tar.gz
mv jemalloc-5.2.0 jemalloc
cd jemalloc/
autoconf
./configure
make
#重新編譯kbengine
cd ../../../
make -j4
問題六:編譯過程出現(xiàn)不同平臺gcc對char類型默認定義不同的問題
現(xiàn)象描述:
編譯過程出現(xiàn)不同平臺gcc對char類型默認定義不同的問題,如圖2-6所示。
圖2-6 默認定義不同

可能原因:
x86上的gcc 把char 定義為signed char;而ARM平臺上使用的arm-linux-gcc 卻把char 定義為unsigned char。
解決方法:
在編譯時加-fsigned-char參數(shù),指定char為signed char。
修改src路徑下的“build/common.mak”文件,修改方法如下:
vim build/common.mak
注釋一行:
#CXXFLAGS += -Werror
新增一行:
CXXFLAGS += -fsigned-char
make
問題七:編譯成功后運行dbmgr進程出連接失敗
現(xiàn)象描述:
啟動測試程序出現(xiàn):"InterfacesHandler_Interfaces::reconnect(): couldn't connect to(interfaces server): 127.0.0.1:30099! ",如圖2-7所示。
圖2-7 連接失敗

可能原因:
編譯成功后運行dbmgr進程出連接失敗。
解決方法:
修改InterfacesHandler_Interfaces::reconnect()函數(shù)中select函數(shù)的超時設置(函數(shù)所在的文件路徑為: kbengine-2.5.2/kbe/src/server/dbmgr/interfaces_handler.cpp),修改方法如下:
//struct timeval tv = { 0, 2000000 };//原函數(shù)
struct timeval tv = { 2, 0 };//修改后的配置
修改完成后,請重新編譯該工程即可,不需要執(zhí)行make clean。