今天发现了一个很奇怪的bug,不是每次都会出现。
现象:
英雄被怪物打死了,正常情况应该弹出失败的对话框,但是系统没有检测出英雄已经死亡。
用debug单步调试,英雄死亡之后系统却能检测出来,说明这是一个race condition类型的bug。
分析:
现有的实现机制是,怪物打死英雄或士兵后,系统会检测打死的是不是英雄。如果是英雄,会mark一个global value为true,表示英雄已经阵亡。系统有一个audit专门监控global value,如果英雄死亡,会弹出失败对话框终止游戏。
但是有一种偶然情况。
1. 怪物发出子弹攻击英雄。
2. 我方(英雄,士兵,宠物)攻击怪物。
3. 怪物死亡。
4. 英雄死亡。
5. 怪物已经被打死,从怪物列表被删除,没有办法mark global value。
游戏早期双方数量较少,不容易浮现。后期随着战斗中同屏怪物,英雄士兵数量增加,实时战斗,这个问题开始浮现。
解决方案:
我方(英雄,士兵,宠物)死亡时自我检查,并mark global value。
总结:
随着实时战斗的复杂化,边界情况(阵亡,多个子弹同时攻打一个object,范围伤害)很容易出现各种问题。
要对自己设计的框架保持信息。
暂无关于此日志的评论。