rainmanhhh 发表于 2009-6-12 16:49:37

FirstOfGroup的写法和Filter的写法哪个好呢?

比如模拟弹射类技能或者变换队形之类的时候,是先创建Group然后loop->FirstOfGroup->DoSomthing好呢还是用全局空单位组GroupEnumUnitsInRange+Filter好?
或者说两者各有所长?

eff 发表于 2009-6-12 16:53:48

完全不知道你说的什么东西。。

rainmanhhh 发表于 2009-6-12 17:18:48

回 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里面去

louter 发表于 2009-6-12 17:31:28

后者没法传递局部变量,不过效率高一些,仅此而已

eff 发表于 2009-6-12 17:34:15

不能传递局部变量你用全局的么。。

用完firstofgroup要记得GroupRemoveUnit

而且这个似乎和排泄,效率没什么关系

louter 发表于 2009-6-12 18:45:12

Filter是不能传递局部变量啊……前者只是用loop结构在本函数里模拟了filter的作用而已。

至于效率问题,我不知道blz是怎么写的GroupEnum,但至少速度会比脚本语言会快一些吧?(我的表达错误?效率 != 速度?)

rainmanhhh 发表于 2009-6-12 18:56:34

前者要做add unit to group和remove unit from group的动作;
后者要进行function f的压栈和出栈
除此以外循环体中的功能代码都是一样的

我的疑问就是哪个效率会高一点

linzefei 发表于 2009-6-13 05:08:18

以前的测试
结论是

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:以前都听说是 单位组直接动作 快。。。。但那次别人说了下。。然后我测试。。。。结果反而相反。。

q267009886 发表于 2009-6-13 06:32:08

引用第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

雖然結果是一樣的

linzefei 发表于 2009-6-13 06:37:55

附件不存在

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

这样。。。

rainmanhhh 发表于 2009-6-13 17:17:23

也就是说最佳的写法还是用loop做是吧?(而且用loop还不需要绑定变量,也可以用wait动作)

linzefei 发表于 2009-6-13 17:33:41

en...

louter 发表于 2009-6-13 18:54:38

但是说到底模拟还是模拟的ForGroup,GroupEnum还是要用的,我一般的写法是先GroupEnum里一个filter,刨去建筑、尸体和马甲,然后循环里再进行其它判断,或许以后可以把filter改成可调用函数?恩……

actboy168 发表于 2009-6-13 19:34:59

怎么我测试的结果是第2种>第3种>第1种...

linzefei 发表于 2009-6-13 19:47:26

回 13楼(actboy168) 的帖子

你去测试下我发的演示?
或者把你的测试地图发来看看。。

actboy168 发表于 2009-6-13 20:52:38

就是你的图啊

我测试的结果是用FirstOfGroup8个开始卡,用ForGroup6个开始卡,而把ForGroup注释掉,18个开始卡

libla 发表于 2009-6-13 20:56:53

那你说的第二种是Filter=null的情况下吧?

actboy168 发表于 2009-6-13 21:20:52

引用第16楼libla于2009-06-13 20:56发表的:
那你说的第二种是Filter=null的情况下吧? http://bbs.islga.org/images/back.gif


恩,没看到他把那个注释掉了,去掉注释确实是FirstOfGroup快

linzefei 发表于 2009-6-13 21:26:16

而把ForGroup注释掉,18个开始卡

此时Filter=null

。。。你要把下面的注释//去掉

actboy168 发表于 2009-6-13 21:28:10

看到了.....
页: [1] 2
查看完整版本: FirstOfGroup的写法和Filter的写法哪个好呢?