前段时间经过研究发现,比起执行条件,执行动作要消耗很多的资源。
下面是测试图:
附件: Text.w3m (2006-6-15 16:21, 16.73 K)该附件被下载次数 19
按Left键将生成一个每0.001秒运行一次的触发,该触发只有以下动作:
function A takes nothing returns nothing
set udg_I=Pow(67.67867,67.6767)
set udg_I=Pow(67.67867,67.6767)
set udg_I=Pow(67.67867,67.6767)
call SetUnitLifeBJ( gg_unit_Hamg_0005, GetRandomReal(1,500) )
endfunction
按Right键生成一个每0.001秒运行一次的触发,该触发只有以下条件:
function C takes nothing returns boolean
set udg_I=Pow(67.67867,67.6767)
set udg_I=Pow(67.67867,67.6767)
set udg_I=Pow(67.67867,67.6767)
call SetUnitLifeBJ( gg_unit_Hamg_0005, GetRandomReal(1,500) )
return false
endfunction
可以看到在条件和动作里执行了一样的代码,然后看下面的测试结果:
首先进入游戏,只按Left键,
当按6次时,CPU占用率过50%
按 13次时,游戏开始卡
再退出游戏,重建,只按Right键,
按 15次时,CPU占用过50%
按 34次时,游戏开始卡
可以看到,结果是非常明显的。
那么,我们在以后在写触发时,特别是那些运行比较频繁的触发时,就可以考虑不写动作而把要执行的代码写到条件里去,这样是可以提高不少效率的。
那么在条件里运行代码的做法和在动作里运行有什么区别吗?答案是有的,在条件中是不能使用等待命令的,所有在等待命令之后的动作都将被忽略,不过我们可以用Timer计时器或用TriggerExecute调用函数来代替等待。
下面是另一个测试:
1.在动作中的SetUnitLifeBJ前加等待命令
function A takes nothing returns nothing
set udg_I=Pow(67.67867,67.6767)
set udg_I=Pow(67.67867,67.6767)
set udg_I=Pow(67.67867,67.6767)
call TriggerSleepAction(1)
call SetUnitLifeBJ( gg_unit_Hamg_0005, GetRandomReal(1,500) )
endfunction
2.在条件中使用Timer计时器
function Tm takes nothing returns nothing
call SetUnitLifeBJ( gg_unit_Hamg_0005, GetRandomReal(1,500))
call DestroyTimer(GetExpiredTimer())
endfunction
function C takes nothing returns boolean
set udg_T = CreateTimer()
set udg_I=Pow(67.67867,67.6767)
set udg_I=Pow(67.67867,67.6767)
set udg_I=Pow(67.67867,67.6767)
call TimerStart(udg_T,1,false,function Tm)
return false
endfunction
结果令人意想不到的是,这种在条件中创建无数Timer计时器的做法仍然比使用动作要有效率。
那么,不用我说大家也知道这意味着什么了,是的,我们可以完全摒弃传统的触发写法了。

责任编辑:admin
进入论坛参与针对本文章的讨论
