KBEngine经常会遇到的问题和处理办法

本文总结了KBEngine游戏服务器开发中遇到的一些常见问题及处理方法,包括属性同步、方法调用、登录控制、动态开关、日志配置、心跳设置、属性作用域、导入模块等关键点,为游戏服务器开发提供了实用的参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kb引擎经常会遇到的问题和处理办法。

1,如果你的属性是同步的,如果通过

self.dict[strP] = val
去修改不会触发属性同步,可以使用
setattr(self,strP,val),也可以利用dict方式来初始化数据而不发送给客户端。

2,在base里,你可以使用entityCall.cell 来调用cell方法

在cell里也可以通过entityCall.base来调用base方法。

3,entityCall.id是可以在任何地方获得的。

4,def onLogOnAttempt( self, ip, port, password ):

如果重新连线,内存有对象触发,我们可以处理断线重连。
这个回调函数可以返回如下常量值:
KBEngine.LOG_ON_ACCEPT:允许新的客户端与实体进行绑定,如果实体已经绑定了一个客户端,之前的客户端将被踢出。
KBEngine.LOG_ON_REJECT:拒绝新的客户端与实体绑定。
KBEngine.LOG_ON_WAIT_FOR_DESTROY:等待实体销毁后再进行客户端绑定。

5,动态开关,可以在data目里放一个systemInfo.py

#放置一些服务器的参数 systemInfo
import hashlib
serverRegular = 0   #是否正式服
writeMylog = 1      #是否写入mylog
isopen = 0          #是否放人,这个开关只有在正式服公网模式才会验证

然后在login的kbemain.py中定义

	if(systemInfo.isopen != 1):
		#如果关闭了停止登录,提示用户自定义消息1
		errorno = KBEngine.SERVER_ERR_USER1
		return (errorno, loginName, password, clientType, datas)

来开启和关闭服务器用户登录

6,cellData参数在创建cell对象的时候就无法访问了,直到在销毁cell对象的时候又可以访问了,貌似cellData里的数值会变成销毁cell时候的数值。

所以如果你希望重连后不进入房间,那么可以在cell里的onDestroy清空相关数据。

7,Logs目录的里log输出

玩家数量大会输出很多log,我们通过kbe\res\server\log4cxx_properties_defaults里面的log4cxx配置文件进行配置。
Loggers 六个级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL。
低级别的不会输出,例如设置了DEBUG则TRACE的不会输出。

8,心跳设置

有时候在连线时候加载卡死的函数会掉线,可以在引擎的目录kbengine\kbe\res\sdk_templates\client\unity修改模板,增加下面的脚本
修改KBEngine.cs

		public void SetHeartTick(int heart)
		{
            _args.serverHeartbeatTick = heart / 2;
        }

然后再游戏中,我们继承的类中添加修改心跳周期的函数,例如

public class KB : KBEMain
{
//设置心跳
	public void SetHeartTick(int tick)
	{
		gameapp.SetHeartTick(tick);
    }
	//恢复心跳
	public void ResetHeartTick()
	{
		gameapp.SetHeartTick(serverHeartbeatTick);
	}
}
我们在卡死之前调用KB.inst.SetHeartTick(int.MaxValue);之后回复就可以了。

9,属性作用域

如果一个属性的作用域分为多个部分,那么在实体的对应部分都存在该属性。
存在于实体多个部分的属性只能从属性的源头进行修改,其他部分会得到同步。

请参考如下表:(S与SC或者C都代表属性包含这个部分,不同的是S代表属性的源头,C代表数据由源头同步,SC代表实体的real部分才是源头,ghosts部分也是被同步过去的)

[类型][ClientEntity][BaseEntity][CellEntity]
BASE-S-
BASE_AND_CLIENTCS-
CELL_PRIVATE--S
CELL_PUBLIC--SC
CELL_PUBLIC_AND_OWNC-SC
ALL_CLIENTSC(All Clients)-SC
OWN_CLIENTC-S
OTHER_CLIENTSC(Other Clients)-SC

10,导入其他包

通常我们安装 pip install 包体,安装成功会显示路径,然后
只要把python的包拷贝到kbe\res\scripts\common\Lib下就可以了。

11,发送Post和Get的请求

Post可以使用下面的,首先header需要是application/x-www-form-urlencoded
本来写的是一个

headerdict = {"Content-Type": "application/x-www-form-urlencoded"}
parm = {
   "payid" : one["payid"],
   "shopid" : GameConfigs.BIGSPACE_PAY_ID 
   }
sparm = str(parm).encode('utf-8')
url = "http://192.168.3.18:9999/api/wechat"
KBEngine.urlopen(url,onBigSpacePayHttpCallback,sparm,headerdict)

这种结构发送过去后,表单Form只有一个Keys,内容是parm里的,不能满足需求。
应当按照下面方式来发送就符合一个Key对应一个Value了

headerdict = {"Content-Type": "application/x-www-form-urlencoded"}
parm = "payid=%s&shopid=%s" % (one["payid"],GameConfigs.BIGSPACE_PAY_ID)
sparm = str(parm).encode('utf-8') 

url = "http://192.168.3.18:9999/api/wechat"
KBEngine.urlopen(url,onBigSpacePayHttpCallback,sparm,headerdict)

def onBigSpacePayHttpCallback(httpcode, data, headers, success, url):
	#if success :
	#	self.FinishPay.de
	INFO_MSG("返回,httpcode: %s , 成功: %s, url: %s , data : %s" % (httpcode,success,url,data))
	if success == False :
		WARNING_MSG("失败: %s" % (url))

Get可以使用:

url = "http://192.168.3.18:9999/API/reg.aspx?UserTel=&%s&ScriptID=%s&UserNumber=%s&StartTime=%s&EndTime=%s&PlayTime=%s" %(str(one["lineoffid"]),str(one["fbid"]),str(one["lineoffno"]),str(sbtime),str(setime),str(one["longtime"]))
KBEngine.urlopen(url,onHttpCallback)

def onHttpCallback(httpcode, data, headers, success, url):
	#if success :
	#	self.FinishPay.de
    print("onHttpCallback") 
    print(httpcode, data, headers, success, url) 	
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值