众所周知,不知道什么时候开始每次过蓝条之后都会卡好一会,这个卡顿需要关闭公会新闻来解决

无聊去研究了一下暴雪界面的源码
相关代码都在GuildNews.lua里
这是公会新闻相关的事件处理

打开网易新闻 查看精彩图片

也就是说,每次过图的时候,公会界面都会调用QueryGuildNews()重新向服务器查询一次所有公会新闻,随之而来的是一连串的“GUILD_NEWS_UPDATE”事件

打开网易新闻 查看精彩图片

这个事件具体会触发多少次尚不清楚,不过可以确定的是公会新闻量越大触发次数越多
我另外做了个计数器测试:
我自己的仓库公会(没几条信息)登陆时会触发7次
大号的公会登录时触发了2486次,每次过图又会触发800-2000次不等
过图前

打开网易新闻 查看精彩图片

过图后

打开网易新闻 查看精彩图片

然后每次事件都会执行一次公会新闻更新

打开网易新闻 查看精彩图片

在这里会拉取所有数据,然后更新新闻列表
这个self.ScrollBox:SetDataProvider(dataProvider);会清除滚动列表 然后一条条重新添加,这个就是卡顿的主要来源了

那么有多少数据呢,拿我们公会举例,公会新闻里面一共有7400多条数据

也就是说,每次过图的时候
游戏会重复的向公会新闻框体添加约600-1400万次数据,不卡都是怪事(我愿称之为暴雪式R星循环)

实际情况下,当你把公会新闻过滤器全部关掉,这些事件仍然会触发,但是不会添加内容了(所以就不卡了)
写了段代码把原有公会新闻框体的事件处理器替换掉,这样每秒最多处理一次公会新闻更新,多触发的会被延迟到1秒后一次性执行,这样就可以肆无忌惮的打开公会新闻了(也顺便减少了刷新其他公会内容造成的资源浪费(微乎其微))

另外:我已经把这个修复集成进我的小工具插件了https://nga.178.com/read.php?tid=41372152