找回密码
 点一下
查看: 7588|回复: 15

关于触发运行效率的研究

[复制链接]
发表于 2006-8-21 11:56:07 | 显示全部楼层 |阅读模式
关于触发运行效率的研究                    ——  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

Text.w3m

17 KB, 下载次数: 95

发表于 2006-8-21 18:38:08 | 显示全部楼层
老狼,你那篇Jass进阶的教程还在吗?

[ 本帖最后由 命不久矣 于 2006-8-21 18:45 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2006-8-21 23:00:56 | 显示全部楼层
没鸟~U9上也没发过

人间蒸发了
回复

使用道具 举报

发表于 2006-8-22 14:01:35 | 显示全部楼层
那可太遗憾了……
唉。
回复

使用道具 举报

发表于 2006-8-25 12:46:52 | 显示全部楼层
偶昨晚上也刚验证了计时器的效率
回复

使用道具 举报

发表于 2006-8-26 16:51:48 | 显示全部楼层
啊!!!特来膜拜强大的老狼。。。
老狼出个图啊?
回复

使用道具 举报

发表于 2008-9-27 12:57:22 | 显示全部楼层
学习了``
回复

使用道具 举报

发表于 2008-9-27 21:18:21 | 显示全部楼层
多谢多谢  
回复

使用道具 举报

发表于 2008-9-28 18:12:07 | 显示全部楼层
我也有过这样的想法,
但是只是把它看成是一种灵活的写法。

没想到竟然在效率上会有区别


又一次验证了实践才是真理啦
回复

使用道具 举报

恶声恶气 该用户已被删除
发表于 2008-9-28 21:47:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2009-6-20 12:06:01 | 显示全部楼层
资源消耗上有些许差别,地图中需要大量运算的可能就会有差别了
回复

使用道具 举报

发表于 2009-6-28 09:35:35 | 显示全部楼层
挖坟啊
回复

使用道具 举报

发表于 2009-6-28 12:26:21 | 显示全部楼层
知道你还跟?
回复

使用道具 举报

发表于 2009-6-29 18:28:33 | 显示全部楼层
你还不是一样么
回复

使用道具 举报

发表于 2009-6-30 15:43:24 | 显示全部楼层
你干嘛又跟我一样.
回复

使用道具 举报

发表于 2009-7-3 21:14:59 | 显示全部楼层
不准挖坟
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-20 08:01 , Processed in 0.113076 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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