|
|
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
|
|