魔兽世界在近期更新后很多小伙伴们会出现蓝条卡顿的问题,这个卡顿其实是因为暴雪源码中的事件处理逻辑出现问题导致的,需要关闭公会新闻来解决,详细操作步骤请看正文。
魔兽世界蓝条卡顿解决方法如下:
众所周知的原因,不知道什么时候开始每次过蓝条之后都会卡好一会,这个卡顿需要关闭公会新闻来解决。
NGA的用户@老李三鹿李发现这是由于暴雪源码中的事件处理逻辑导致的,并给出了解决方案。
问题根源:
每次玩家过图时,公会界面都会调用QueryGuildNews()函数;
重新查询所有公会新闻,触发一连串的“GUILD_NEWS_UPDATE”事件。
事件触发分析:
事件触发次数与公会新闻量成正比,新闻量越大,触发次数越多。
测试显示,小型公会触发7次,大型公会触发2486次,每次过图额外触发800-2000次不等。
过图前:
过图后:
卡顿原因:
每次事件都会执行公会新闻更新,拉取所有数据并更新新闻列表,这是卡顿的主要来源。
在这里会拉取所有数据,然后更新新闻列表,这个self.ScrollBox:SetDataProvider(dataProvider);
会清除滚动列表 然后一条条重新添加,这个就是卡顿的主要来源了。
数据量估算:
以某公会为例,公会新闻里面一共有7400多条数据。
每次过图时,游戏会重复向公会新闻框体添加约600-1400万次数据。
解决方案:
@老李三鹿李编写了一段代码,替换原有公会新闻框体的事件处理器,限制最多处理一次公会新闻更新,多触发的更新会被延迟到1秒后一次性执行。
请将代码复制并粘贴到您的任意lua文件中。
代码实现:
local BLZCommunitiesGuildNewsFrame_OnEvent = CommunitiesGuildNewsFrame_OnEventlocal newsRequireUpdate, newsTimer
CommunitiesFrameGuildDetailsFrameNews:SetScript("OnEvent", function(frame, event)
if event == "GUILD_NEWS_UPDATE" then
if newsTimer then
newsRequireUpdate = true
else
BLZCommunitiesGuildNewsFrame_OnEvent(frame, event)
-- 1秒后, 如果还需要更新公会新闻, 再次更新
newsTimer = C_Timer.NewTimer(1, function()
if newsRequireUpdate then
BLZCommunitiesGuildNewsFrame_OnEvent(frame, event)
end
newsTimer = nil
end)
end
else
BLZCommunitiesGuildNewsFrame_OnEvent(frame, event)
end
end)
通过上述修改,玩家可以更加流畅地浏览公会新闻,同时减少了因频繁更新造成的资源浪费。
以上就是笔者整理的魔兽世界蓝条卡顿的相关内容了,更多游戏攻略请关注玩一玩游戏网。