FirstOfGroup的写法和Filter的写法哪个好呢?
比如模拟弹射类技能或者变换队形之类的时候,是先创建Group然后loop->FirstOfGroup->DoSomthing好呢还是用全局空单位组GroupEnumUnitsInRange+Filter好?或者说两者各有所长? 完全不知道你说的什么东西。。
回 1楼(eff) 的帖子
就是单位组操作啊,比如要做属性相关伤害的群体技能,为了排泄和提高效率做成:
local Group g = CreateGroup()
local unit u = null
call GroupEnumUnitsInRange(g, x, y, r, null)
loop
set u = FirstOfGroup(g)
exitwhen g==null
...
endloop
或者:
call GroupEnumUnitsInRange(g, x, y, r, Condition(function f))
把动作都写到f里面去 后者没法传递局部变量,不过效率高一些,仅此而已 不能传递局部变量你用全局的么。。
用完firstofgroup要记得GroupRemoveUnit
而且这个似乎和排泄,效率没什么关系 Filter是不能传递局部变量啊……前者只是用loop结构在本函数里模拟了filter的作用而已。
至于效率问题,我不知道blz是怎么写的GroupEnum,但至少速度会比脚本语言会快一些吧?(我的表达错误?效率 != 速度?) 前者要做add unit to group和remove unit from group的动作;
后者要进行function f的压栈和出栈
除此以外循环体中的功能代码都是一样的
我的疑问就是哪个效率会高一点 以前的测试
结论是
call GroupEnumUnitsInRange(udg_g,0,0,200,null)
call ForGroup(udg_g,function dwzdz)
call GroupEnumUnitsInRange(udg_g,0,0,200,udg_b)
这2个
选取时判断 和另外运行效率差不多
local unit u
call GroupEnumUnitsInRange(udg_g,0,0,200,udg_b)
loop
set u=FirstOfGroup(udg_g)
exitwhen u==null
call GroupRemoveUnit(udg_g,u)
endloop
但这个效率好上很多~~
测试方法是 在地图中心 放一定量的单位
然后计时器0.0001 分别循环调用
为了公平 以上测试 都没有写额外动作
function dwzdz takes nothing returns nothing//boolean
//return false
endfunction
set udg_b=Filter(function dwzdz)
单位组的话 15个很卡 18卡的不像话了
模拟的话 25很卡 30卡的无语了
ps:以前都听说是 单位组直接动作 快。。。。但那次别人说了下。。然后我测试。。。。结果反而相反。。 引用第7楼linzefei于2009-06-13 05:08发表的 :
以前的测试
结论是
call GroupEnumUnitsInRange(udg_g,0,0,200,null)
call ForGroup(udg_g,function dwzdz)
....... http://bbs.islga.org/images/back.gif
這樣才對..
...Ga有Bug
附件不得使用相同檔名..
前者強制復蓋後者
似乎不是每次都會出現
回linzefei
測試的內容為 Filter 而不是 ForGroup
雖然結果是一樣的 附件不存在
...ls?
原来你瞬间把附件编辑掉了么。。
你想表达什么。。
哦 你说 set udg_b = Filter(function dwzdz)
这个把。。我那个我也有测试的啊。。。只是注释掉了而已。
那个上面7楼有说
测试结果和 在另外单位组动作差不多的
看错。。
还加了这些
function dwzdz takes nothing returns boolean
local unit u = GetFilterUnit()
set u = null
return false
endfunction
那样的话单位组 就更慢了。。。
我之前是测试
function dwzdz takes nothing returns boolean
return false
endfunction
这样。。。 也就是说最佳的写法还是用loop做是吧?(而且用loop还不需要绑定变量,也可以用wait动作) en... 但是说到底模拟还是模拟的ForGroup,GroupEnum还是要用的,我一般的写法是先GroupEnum里一个filter,刨去建筑、尸体和马甲,然后循环里再进行其它判断,或许以后可以把filter改成可调用函数?恩…… 怎么我测试的结果是第2种>第3种>第1种...
回 13楼(actboy168) 的帖子
你去测试下我发的演示?或者把你的测试地图发来看看。。 就是你的图啊
我测试的结果是用FirstOfGroup8个开始卡,用ForGroup6个开始卡,而把ForGroup注释掉,18个开始卡 那你说的第二种是Filter=null的情况下吧? 引用第16楼libla于2009-06-13 20:56发表的:
那你说的第二种是Filter=null的情况下吧? http://bbs.islga.org/images/back.gif
恩,没看到他把那个注释掉了,去掉注释确实是FirstOfGroup快 而把ForGroup注释掉,18个开始卡
此时Filter=null
。。。你要把下面的注释//去掉 看到了.....
页:
[1]
2