• 案例
  • ECA
  • Localmulti

本地多开定位不同步说明

说明

用户由于使用ECA不当,频繁出现游戏逻辑不同步的问题,影响游戏正常运行。用户可在本地多开测试游戏时借助调试方法进行调试。 关于容易引发游戏逻辑不同步的常见问题,可以参考这篇文档多人联机同步机制,详细列举了常见导致逻辑不同步的问题,可以结合案例说明进行理解,对自己项目中的问题进行排查修正。

本地配置不同步日志环境

1.打开【通用设置-调试】,进行本地多开相关配置

BD01

打开本地多开同步检测后,会在本地测试出现不同步后弹窗提示,并提供不同步日志文件以供用户定位不同步问题

2.还可以借助Lua文件配置更详细的不同步日志。

BD02

3..打开地图路径下Script文件夹下的main.lua文件,在lua文件中配置不同步日志相关API,例如:

BD03

详细接口介绍见下文【不同步日志Lua配置API】,可根据自己项目状况考虑具体性能影响选择合适的配置。

4.配置完毕后,本地多开运行游戏。如遇游戏逻辑不同步,弹窗提示并在本地生成不同步日志

BD04 BD05

定位不同步问题

1.打开下载的不同步日志文件夹,使用外部文本对比工具进行对比(推荐使用BeyondCompare)

不同步日志文件中包含的是出现不同步情况的帧信息,通过对比玩家日志差异,可以大致定位到问题所在。

举例说明

1.地图中在main.lua文件中进行配置

GameAPI.api_set_enable_detail_snapshot(true);
GameAPI.api_set_enable_timer_snapshot(true);

2.本地多开测试游戏,遇到不同步状况,编辑器弹窗提示不同步并提供不同步日志以供定位问题。

3.打开不同步日志,查看逐帧日志,了解不同步帧运行情况,辅助定位问题

BD06

4.将多名玩家日志成对拖放到beyondcompare中进行对比,对差异部分附近信息重点分析

5.下面对比截图是玩家2比玩家1多了一个timer,各字段含义见图

BD07

通过对不同步信息附近的帧信息进行理解,可大致定位问题为某个客户端上多了一个循环计时器,在项目中进行查找可能的问题所在。

BD08

不同步日志Lua配置API

API描述参数返回值
api_set_enable_detail_snapshot开启/关闭不同步详细日志的总开关,默认关闭。(这个是总开关,关了这个之后别的设置接口都不生效了了,但性能最好)enable:是否开启,类型为bool,默认为false
api_set_snapshot_traceback_level设置某些日志的堆栈记录详细等级,默认为0;0代表不记录堆栈; 1代表仅记录最近一层堆栈;2代表完整堆栈(带压缩,数据量小但有一点性能开销); 3代表完整日志(不压缩,数据量稍大);越完整的堆栈记录越便于定位不同步产生点,但是性能消耗会增高level:堆栈记录等级,类型为Int32,默认值为0
api_set_enable_timer_snapshot开启/关闭timer不同步检测日志。默认关闭。开启后可以检测出哪里多创建了ECA计时器,但计时器不一致并不一定代表着实际游戏内容不同步(比如计时器回调里只做表现层修改就是安全的)enable:是否开启,类型为bool,默认值为false
api_set_enable_eca_snapshot开启/关闭ECA不同步检测日志。默认关闭,开销较高。可通过参数过滤掉一些安全的API以防止误报,例如创建特效、UI操作等enable:是否开启,类型为bool,默认值为false;string:开启结果
filter_mode:过滤模式。类型为Int32,默认为1;1: 剔除模式,不记录filter_set中指定的api;0 :包含模式,仅记录filter_set中指定的api;
filter_set:过滤集合,类型为table,默认为"client_only","client_possible";可传入想要剔除/包含的API(取决于上个参数),如"client_only", "client_possible","GameAPI:print_to_dialog","GameAPI:get_function_return_value。"
client_only和client_possible为官方确认安全/较安全的API集合,即在使用得当的情况下即使调用次数不一致也不会影响游戏核心逻辑,通常可以将其加入剔除集合中以避免误报
api_set_detail_snapshot_enable_tag设置不同步详细日志级别。越详细越利于定位不同步产生点,但性能消耗会增高tag:用于控制开启哪些日志的mask。类型为UInt64。;0xFFFFFFFF全部开启,默认开启16+32。;1运动器tick;2运动器碰撞检测;4寻路回调;8寻路坐标更新;16血量变化;32坐标瞬变
add_detail_log记录自定义日志,用于定位不同步log:日志内容,类型为stringbool,值恒定为true