找回密码
 立即注册
搜索
查看: 98|回复: 5

[沟通中] 关于计算所有属性之后回调的严重问题

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式
BUG反馈
引擎版本号: 20260203
登陆器版本号: 20260203
BUG描述: actor:setBuff() 和 actor:clearBuff() 同一时间内执行X次会导致GetAccessoryEnd 和 on_RecalcAbilEnd 执行 X 次!
导致这些回调内的代码会在同一时间内重复执行 X 次
BUG重现方式: actor:setBuff() 和 actor:clearBuff() 同一时间内执行X次会导致GetAccessoryEnd 和 on_RecalcAbilEnd 执行 X 次!
导致这些回调内的代码会在同一时间内重复执行 X 次
修复后应达到的效果: 应该是所有buff事件结束后只执行1次!
联系QQ: 隐藏内容




问题描述:
当同一帧内连续调用多次 actor:setBuff()、actor:clearBuff() 时,每次都会触发一次属性重算,导致 GetAccessoryEnd 和 on_RecalcAbilEnd 被连续触发多次,造成回调函数重复执行、性能浪费、逻辑异常。
需求:
希望引擎支持【合并同一帧内的重复属性刷新】,无论一帧内调用多少次 setBuff/clearBuff,最终只触发一次回调。
期望效果:
同一帧内无论多少次 setBuff/clearBuff,只执行:1 次 GetAccessoryEnd 类事件 而不是执行 N 次。

例子:
function test1(player)
     player:setBuffEx(1, 30, "5,1|")
     player:setBuffEx(2, 30, "7,1|")
     player:setBuffEx(3, 30, "9,1|")
     -- 这里只是测试,实际中可能在各个文件中加入很多这些不同的buff,例如使用技能回调,被技能攻击回调,自定义增加属性事件等
     player:setVal_N_Ex("Num",0) -- 初始化执行次数
end

--身上所有装备计算属性结束触发(人物、英雄有效)(返回值累加至属性总和)
[[function GetAccessoryEnd(Actor)
test2(Actor)
end]]
--刷新属性结束(人物、英雄)
function on_RecalcAbilEnd(Actor)

test2(Actor)

end
function test2(player)

        -- 计算执行次数(人物执行)
        local n = player:getVal_N_Ex("Num") + 1
        player:setVal_N_Ex("Num",n)
        print(n)
       -- 这里会因为test的原因连续重复执行很多次
      
       -- 假设我们在后面加入很多代码,那么这些代码就会非必要的重复执行很多次,如果代码量比较大,就会产生耗时风险
end



回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
增加BUFF,需要重新计算属性,删除BUFF,也需要重新计算属性,这是必须的操作。
所以上面说的是无法实现的。
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
这种是不可能调整的,会造成严重的后果的,当你所有BUFF都设置好了,但没刷新属性,直接就完蛋了
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
setBuff()如果不刷新属性,

复活、重生、护身、内功、心法、外观等属性变化时,根本没有通知登陆器,即会出现很多问题

因为精灵的刷新属性方法,并不会去同步这些数据
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
请关帖,可以自行用标记的方式在回调时判断是否触发自己写的代码段规避重复执行!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|HGEM2论坛

GMT+8, 2026-4-19 17:33 , Processed in 0.275023 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表