本文继续记录一点自己查找定位 Bug 过程中的思考
近来遇到了一个让人有些’无语’的 Bug,花了不少时间来定位,结果却略显尴尬.
问题是这样的,游戏(基于 UE5)功能侧需要触发一段旁白动画和音频,功能本身(旁白动画和音频)是现成的,应该可以开箱即用,不过自己对于当前游戏项目不是特别熟悉,所以大概搜索了一下,发现脚本侧就有相关触发接口,于是依样画葫芦的调用了下(沿用了大部分参数,仅改了动画和音频的参数),发现只能触发音频,不能触发动画,一开始以为是不是接口使用上有些纰漏,但检查多遍后并未发现什么问题,一时竟有些卡壳了 …
没办法,深入接口实现看了下,一眼望去也没发现什么明显的疑问点,于是把上下文和问题表现抛给了 AI,希望能扩展点思路,AI 一顿分析下来确实也给了不少新想法,但总有些生搬硬套的感觉,让人将信将疑,尝试按照 AI 提示改了下代码,发现问题依旧,看来目前信息仍然不足,于是自己开始在接口实现中添加日志 …
好在目前接口主要以脚本实现,在脚本中调整日志还是比较方便的(如果改为在 C++ 中调整,那即便用上 Live Coding 也要花费很长时间,不免让人焦躁难耐),从日志来看,脚本接口触发后确实调用到了动画播放接口(以及音频播放接口),但表现上确实只有音频能正常播放,而动画则完全没有反应,同时也注意到在参数传递上好像是有些异常,但这些异常又让人非常费解,于是再一次把这些信息喂给了 AI,经过了一大段思维链’推理’之后,AI 提出什么 脚本 与 C++ 的’数据通信’可能存在问题(涉及 GC 一类的话题),导致脚本闭包出错之类的说法,实在让人不可置信 …
一筹莫展之际,想到干脆用 C++ 侧接口再测试下好了(之前使用了 脚本侧 接口),虽然感觉正常来讲两者应该没啥区别,但毕竟目前没有什么其他思路,权作死马当活马医好了,但结果却出人意料 : 使用 C++ 侧接口后,表现一切正常,之前不能正常播放动画的问题消失了 !!!
按功能结果来看,目前其实已经可以交差了(改为使用 C++ 接口即可),但是自己还是想确认下问题根源,于是开启了 Bug 定位的下半场 …
既然调用 C++ 侧接口表现正常,调用 脚本侧 接口表现出错,那就对比下两者的逻辑触发有何不同好了,但是结果再一次让人惊讶 : 两者的逻辑触发没有差异 …
那么为何调用 C++ 侧接口就能正常播放动画,而调用 脚本侧 接口就不行呢 ? 继续细跟了一番,发现是由于对应的 SWidget 不能正常 Tick 导致的(调用 脚本侧 接口情况下),自己对于 Slate 的更新机制不是特别熟悉,于是又转去了解了下相关逻辑,最终发现 SWidget Tick 相关的设置其实两者都有触发(调用 C++ 侧接口情况下 和 调用 脚本侧 接口情况下),但是在调用 脚本侧 接口情况下,相关 SWidget 就是不能正常进行 Tick,着实让人不解 …
看上去似乎只能深入 Slate 的实现层继续追踪了(因为偏底层的关系,需要定义一些过滤代码,否则触发会过于频繁),正当自己准备卷起袖子开干时,突然注意到,上述两种调用情况下所触发的 SWidget 竟然是不同的(代码相同,但内存实例不同) !?
顺藤摸瓜,最后终于找到了原因:
原来,上述的 C++ 侧接口 和 脚本侧 接口虽然大体上是一致的,但是实际上其中涉及的事件参数是不相同的,大概的区别就是:
- C++ 侧接口对应的事件参数是 A.B.C
- 脚本侧接口对应的事件参数是 A.B.C.D
之前由于接口涉及的参数比较多,自己并没有关注到事件参数的差异,而旁白(包括动画和音频)功能只能响应 A.B.C 事件参数(而不能响应 A.B.C.D 事件参数),于是相关功能便不能正常触发了(调用 脚本侧 接口情况下) …
但是我们之前不是说调用 脚本侧 接口能够触发音频吗(只是不能正常触发动画) ? 按照上面的说法,应该连 音频 也不能正常触发才对.
这就来到了这个 Bug 最坑的地方了,原来在目前的游戏中有两处旁白功能(功能逻辑完全一样,只是响应的事件参数不同,一个响应 A.B.C 事件参数,一个响应 A.B.C.D 事件参数),只是响应 A.B.C.D 事件参数的旁白功能默认是隐藏的,所以不会执行相关的 Slate Tick,但是其又能响应 A.B.C.D 事件参数来触发音频(其实也触发动画,只是因为隐藏的关系所以不能正常播放),于是乎就产生了上述的问题表现 …
Bug 原因确实让人觉得有些尴尬无语,虽然本身并不复杂,但是表现上也可属于疑难杂症了,排查方法还是按可疑程度来逐步验证了,有时候问题点要’历尽艰险’才能显现,工具(AI 等)也能提供一些思路,但是总的来说还是离不开自己的判断删选,否则容易误入歧途 ~
1562

被折叠的 条评论
为什么被折叠?



