※ 引述《dsa3717 (FishCA)》之铭言:
: http://dbz-dokkan.bngames.net/info1116.html
: 官方出正式声明了
: 还把出问题的程式码贴出来www
小弟键盘工程师没有玩,但是根据文章大概是这么个意思(尽量白话):
游戏里面卡片是以ID来存卡片资料的
当程式因为某些缘故要展现脚色资料的时候(列出卡池啦,展示你已经有的卡片等等)
会利用卡片ID去查对应的资料然后显示给你
而文章里那段code就是流程
①是
传入需求的卡片ID列表,如果该卡片是你APP启动后已经有显示过的卡片
那该卡片的资料会已经在你手机内存里
而如果没有显示过的卡片呢? 就找不到,会是个空指标
于是接着②
程式利用卡片ID去数据库查相关资料,并抓回来填进cache里的空缺
资料都填满后就处理完毕
逻辑上是这样,但是这边遇到的BUG是
他从数据库查回来的资料并没有排序,而程式也没有比对ID,直接依照抓回来的顺序填坑
用他给的举例来讲:
你要查询的卡片ID是 1 3 5 7 9 (已按大小排序)
手机已经显示过,存在内存里的卡片资料是 1 3 5 空 9
所以缺了7的资料,就要用②的方式去数据库查7的资料回来
然而他的查询语法没排序(估计table字段也没有),所以查回来的资料可能是 9 3 7 1 5
然后程式直接做比对: 1 3 5 空 9
9 3 7 1 5
好,所以他就把1的资料给放进内存里的那个空白去了 (开放吐槽)
所以即使你用 1 3 5 7 9 去查,也会变成查到 1 3 5 1 9 的资料,自然显示错误
而内存里的卡片资料是会因为你APP启动后的操作而变动的
所以上面这个BUG会造成不同人有不同的错误显示
然而如果你去按スカウターボタン,程式会去伺服抓正确的id list回来盖掉你手机记忆
体里的资料,就不会有这样的问题出现
大概是这样,有错请指正