新梦战0.26 userdata 报错分析 - 木东驿站 - Powered by MoodBlog

CONTENT

新梦战0.26 userdata 报错分析

TIM截图20180820223138.png

今天很多玩家向我发email提交这个BUG。

从这个错误的提示信息来看,是无法比较userdata与number

userdata是什么呢?其实是lua与c交互的一种结构,userdata指向一块内存区域,一般和c中的结构体相关联。

梦战保存游戏数据时使用的序列化方式是json,就是把数组转换为json格式,然后存放到文件。

如果数组中存在nil,即空值,出于某种考虑,我用的那种json转换器会将其转换为userdata。

以前在保存存档时,我会尽力避开nil,把nil转换成另外的数据,用过lua的同学都知道,nil其实是有很多问题的,使用0代替nil没有任何问题。

但是为什么还是会出现今天这种大规模的报错呢?为什么存档中再次出现了消灭已久的userdata?

我分析了两三个玩家的存档,发现userdata集中出现在召唤兽装备区域。

比如某召唤兽只有第一个、第三个装备,中间没有装备,此时在内存中为nil,我对这种情况的处理办法是:

存档时将nil转-换成-1,读档时再转换回来。

在没有召唤兽仓库之前,玩家所拥有的召唤兽便是全部角色身上携带的召唤兽。

所以每次存档时,只要对全部角色携带的召唤兽搜索nil并将其转换成-1就可以了。

在出现召唤兽仓库之后,玩家全部召唤兽 = 全部角色携带召唤兽+仓库召唤兽

这里我没有对仓库召唤兽进行数据同步处理,所以出现了nil值。

进一步分析,该Bug导致的后果,不只是存档中出现userdata,还会出现数据不同步问题。

比如本次读档时A召唤兽是0级,我将A升到了80,然后放进了召唤兽仓库,此时进行存档。

由于仓库数据并没有同步,所以再次读档时,A又成了0级。

这个BUG不难发现,但破坏力强,会导致游戏无法进入,同时反应了梦战架构的缺陷,代码耦合度过高,变更需求时稍不注意就会带来一系列后果。


个快快 2018年08月20日 天气 晴

REMARKS

© 2018 MoodBlog 0.2 个快快 作品 | 参考主题: mathilda by fuzzz. | 鲁ICP备16047814号