找回密码
 点一下
查看: 6079|回复: 33

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

[复制链接]
发表于 2009-6-12 16:49:37 | 显示全部楼层 |阅读模式
比如模拟弹射类技能或者变换队形之类的时候,是先创建Group然后loop->FirstOfGroup->DoSomthing好呢还是用全局空单位组GroupEnumUnitsInRange+Filter好?
或者说两者各有所长?
发表于 2009-6-12 16:53:48 | 显示全部楼层
完全不知道你说的什么东西。。
回复

使用道具 举报

 楼主| 发表于 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里面去
回复

使用道具 举报

发表于 2009-6-12 17:31:28 | 显示全部楼层
后者没法传递局部变量,不过效率高一些,仅此而已
回复

使用道具 举报

发表于 2009-6-12 17:34:15 | 显示全部楼层
不能传递局部变量你用全局的么。。

用完firstofgroup要记得GroupRemoveUnit

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

使用道具 举报

发表于 2009-6-12 18:45:12 | 显示全部楼层
Filter是不能传递局部变量啊……前者只是用loop结构在本函数里模拟了filter的作用而已。

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

使用道具 举报

 楼主| 发表于 2009-6-12 18:56:34 | 显示全部楼层
前者要做add unit to group和remove unit from group的动作;
后者要进行function f的压栈和出栈
除此以外循环体中的功能代码都是一样的

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

使用道具 举报

发表于 2009-6-13 05:08:18 | 显示全部楼层
以前的测试
结论是
[jass]
call GroupEnumUnitsInRange(udg_g,0,0,200,null)
call ForGroup(udg_g,function dwzdz)
[/jass]
[jass]
call GroupEnumUnitsInRange(udg_g,0,0,200,udg_b)
[/jass]

这2个
选取时判断   和另外运行  效率差不多


[jass] 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[/jass]

但这个效率好上很多~~



测试方法是 在地图中心 放一定量的单位
然后计时器0.0001 分别循环调用
为了公平 以上测试 都没有写额外动作
[jass]function dwzdz takes nothing returns nothing//boolean
    //return false
endfunction

set udg_b=Filter(function dwzdz)[/jass]
单位组的话 15个很卡 18卡的不像话了
模拟的话 25很卡 30卡的无语了

ps:以前都听说是 单位组直接动作 快。。。。但那次别人说了下。。然后我测试。。。。结果反而相反。。

单位组 及模拟单位组 效率测试.w3x

24 KB, 下载次数: 27

回复

使用道具 举报

发表于 2009-6-13 06:32:08 | 显示全部楼层
引用第7楼linzefei于2009-06-13 05:08发表的  :
以前的测试
结论是
[jass]
call GroupEnumUnitsInRange(udg_g,0,0,200,null)
call ForGroup(udg_g,function dwzdz)
.......
這樣才對..

test.w3x (18 KB, 下载次数: 12)

...Ga有Bug

附件不得使用相同檔名..

前者強制復蓋後者

似乎不是每次都會出現

回linzefei

測試的內容為 Filter 而不是 ForGroup

雖然結果是一樣的
回复

使用道具 举报

发表于 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

这样。。。
回复

使用道具 举报

 楼主| 发表于 2009-6-13 17:17:23 | 显示全部楼层
也就是说最佳的写法还是用loop做是吧?(而且用loop还不需要绑定变量,也可以用wait动作)
回复

使用道具 举报

发表于 2009-6-13 17:33:41 | 显示全部楼层
en...
回复

使用道具 举报

发表于 2009-6-13 18:54:38 | 显示全部楼层
但是说到底模拟还是模拟的ForGroup,GroupEnum还是要用的,我一般的写法是先GroupEnum里一个filter,刨去建筑、尸体和马甲,然后循环里再进行其它判断,或许以后可以把filter改成可调用函数?恩……
回复

使用道具 举报

发表于 2009-6-13 19:34:59 | 显示全部楼层
怎么我测试的结果是第2种>第3种>第1种...
回复

使用道具 举报

发表于 2009-6-13 19:47:26 | 显示全部楼层

回 13楼(actboy168) 的帖子

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

使用道具 举报

发表于 2009-6-13 20:52:38 | 显示全部楼层
就是你的图啊

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

使用道具 举报

发表于 2009-6-13 20:56:53 | 显示全部楼层
那你说的第二种是Filter=null的情况下吧?
回复

使用道具 举报

发表于 2009-6-13 21:20:52 | 显示全部楼层
引用第16楼libla于2009-06-13 20:56发表的  :
那你说的第二种是Filter=null的情况下吧?

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

使用道具 举报

发表于 2009-6-13 21:26:16 | 显示全部楼层
而把ForGroup注释掉,18个开始卡

此时Filter=null

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

使用道具 举报

发表于 2009-6-13 21:28:10 | 显示全部楼层
看到了.....
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 02:17 , Processed in 0.752254 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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