華為云計算 云知識 KBEngine如何配置
KBEngine如何配置

簡介

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/src
wget 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/server
vim 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。