|
关于触发运行效率的研究 —— Red_Wolf
2007.6.14:
发现可以使用这样的写法:
function TriggerFunc takes nothing returns nothing
//do anything
endfunction
function initTrigger takes nothing returns nothing
local trigger trg=CreateTrigger()
call TriggerAddCondition(trg,Condition(function TriggerFunc))
endfunction
|
来代替
function TriggerFunc takes nothing returns boolean
//do anything
return false
endfunction
function initTrigger takes nothing returns nothing
local trigger trg=CreateTrigger()
call TriggerAddCondition(trg,Condition(function TriggerFunc))
endfunction
|
但是同样不能在里面使用等待动作,这点要注意,只是可以少写个 return false
|
2006.6:
前段时间经过研究发现,比起执行条件,执行动作要消耗很多的资源。
下面是测试图:
按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计时器来代替等待。
下面是另一个测试:
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计时器的做法仍然比使用动作要有效率。
那么,不用我说大家也知道这意味着什么了,是的,作为Jass使用者的话,我们可以完全摒弃传统的触发写法了。
而对于GUI T使用者,由于T功能的限制,无法做到以上所说;但同样也应该注意以下平时的写法:条件限制尽量写完整,为的是能更少的触发不必要的动作。甚至对于以下两种方案的触发写法,我们也应该选择1而不是2。因为2要在很多不必要的时候触发动作的运行。
Trg1:
条件:A成立 or B成立
动作:if A成立则做动作XXX
else 做动作XXX
Trg2:
条件:无
动作:if A成立则做动作XXX
else B成立则做动作XXX
|
|
|