找回密码
 点一下
查看: 1071|回复: 16

效率问题...

[复制链接]
发表于 2009-3-12 11:14:11 | 显示全部楼层 |阅读模式
有十个触发,它们的事件完全相同,不同的条件对应着不同的动作,并且动作是由N次判断组成的
比如这样
[trigger]
    事件
        单位 - XXXX 使用物品
    条件
        ((被操作物品) 的类型) 等于 物品一
    动作
        自定义代码: local unit u=GetTriggerUnit()
        自定义代码: local player p=GetOwningPlayer(u)
        自定义代码: local integer id=GetConvertedPlayerId(p)
        自定义代码: if udg_BOOLEAN[id] then
        自定义代码: //do someting
        自定义代码: else
        自定义代码: if xxx then
        自定义代码: elseif xxx then
        自定义代码: elseif xxx then
        自定义代码: endif
        自定义代码: //do someting
        自定义代码: endif
        自定义代码: set u=null
        自定义代码: set p=null
[/trigger]
这样在一个事件的开头就需要申明3个局部变量,有十个事件就要写十次,而
[trigger]
    动作
        自定义代码: local unit u=GetTriggerUnit()
        自定义代码: local player p=GetOwningPlayer(u)
        自定义代码: local integer id=GetConvertedPlayerId(p)
        自定义代码: if udg_BOOLEAN[id] then
        自定义代码: //do someting
        自定义代码: else
        自定义代码: //do someting
        自定义代码: endif
        自定义代码: set u=null
        自定义代码: set p=null[/trigger]
这一段是通用的,也就是十个触发的前面全部是这样,不同的只是每个触发动作里如果判断不成立,则运行的动作不同
也就是每个触发的
[jass] if xxx then
elseif xxx then
elseif xxx then
endif[/jass]
这个部分不同

这十个触发仅仅是条件不一样,所以想问一下,如果写成如下情况,会不会效率高一点,既能节省代码量,亦能节省触发器数量...
[trigger]
    事件
        单位 - XXXX 使用物品
    条件
      任意条件成立
         ((被操作物品) 的类型) 等于 物品一
         ((被操作物品) 的类型) 等于 物品二
         ....................
         ((被操作物品) 的类型) 等于 物品十
    动作
        自定义代码: local unit u=GetTriggerUnit()
        自定义代码: local player p=GetOwningPlayer(u)
        自定义代码: local integer id=GetConvertedPlayerId(p)
        自定义代码: if udg_BOOLEAN[id] then
        自定义代码: //do someting
        自定义代码: else
        if  ((被操作物品) 的类型) 等于 物品一  then
        自定义代码: if xxx then
        自定义代码: elseif xxx then
        自定义代码: elseif xxx then
        自定义代码: endif
        elseif  ((被操作物品) 的类型) 等于 物品二  then
        自定义代码: if xxx then
        自定义代码: elseif xxx then
        自定义代码: elseif xxx then
        自定义代码: endif
        elseif  ((被操作物品) 的类型) 等于 物品三  then
          ...............一直到物品十
        自定义代码: endif
        自定义代码: //do someting
        自定义代码: endif
        自定义代码: set u=null
        自定义代码: set p=null
[/trigger]

以前爬帖时看到过一种说法,把一个触发拆分成几个来运行,把在动作里需要判断的条件放到触发器条件里判断效率会高一些,不知道是否属实...即使属实,是否适用于以上这种情况?

再就是...如果不是十个触发器,而只有三四个的情况时,上面这种整合型写法是否会更好一点?
因为在触发器条件里是多个or,每次运行一次触发就需要依次判断是否有条件成立,如果有三个条件,最多会判断三次,如果有几十个条件,那不是在满足某个条件之前会判断之前的几十个条件...那样效率不就没有分开写的高了...
 楼主| 发表于 2009-3-12 11:26:47 | 显示全部楼层
可能看的人有点迷糊...其实中心意思就是
创建十个事件相同的触发器,并为它们各自添加不同的条件和不同的动作

创建一个触发器,在条件里创建多个or连接的条件,并在动作里将这些条件进行判断,不同的条件成立时做不同的事
的效率,哪个要高一点

这里说的效率包括: 事件响应速度,条件判断效率,多个elseif时动作执行速度,与地图载入速度和游戏流畅度......
回复

使用道具 举报

发表于 2009-3-12 11:42:47 | 显示全部楼层
个人感觉,应该是拆开的效率略高一些,因为在条件中的效率要比动作中高
记事这点忽略,放在同一触发中每一个都是判断两次,效率肯定下降的

不过这点效率一般是忽略的吧……
回复

使用道具 举报

 楼主| 发表于 2009-3-12 11:47:09 | 显示全部楼层
还有个问题...
多个elseif是怎么执行的
[jass]
if   xxx   then
//这里有一百段代码
elseif xxx then
//这里又有一百段代码
一共有一百个elseif
endif
[/jass]
那么...每个elseif中间的那一百段代码会影响War3去查找下一个elseif么?
亦或是需要一句一句去跳过?
回复

使用道具 举报

发表于 2009-3-12 11:51:19 | 显示全部楼层
猜想这个和汇编中的jne差不多,不成立的话直接跳到下一段区的,然后下一段再来一次这样的判断,这些是完全不需要lz担心的问题……
回复

使用道具 举报

 楼主| 发表于 2009-3-12 11:53:20 | 显示全部楼层
果然是想多了么
回复

使用道具 举报

发表于 2009-3-12 12:03:32 | 显示全部楼层
合并快......任意单位使用物品,会运行十次条件判断,而合并只需一次
回复

使用道具 举报

 楼主| 发表于 2009-3-12 12:07:57 | 显示全部楼层
所以想问一下啊...
就是不太清楚 是否给触发器添加条件后,当不满足条件时会不会判断这个触发器
回复

使用道具 举报

发表于 2009-3-12 12:12:03 | 显示全部楼层
引用第3楼灼眼のsaber于2009-03-12 11:47发表的  :
还有个问题...
多个elseif是怎么执行的
[jass]
if   xxx   then
//这里有一百段代码
.......


这个不太确定,我推测是会的。war3貌似就是一个个找下去,直到找到elseif为止。

if XXXX then
//code 1
else
//code 2
endif
会被翻译成这样
jmp if false   标记A
//code 1
jmp if true   标记B
jmpdes (目标)  标记A
//code 2
jmpdes (目标)  标记B

如果他不是一步步找下去,jmpdes的作用是什么呢?
回复

使用道具 举报

一抹煞白 该用户已被删除
发表于 2009-3-12 12:14:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2009-3-12 12:17:38 | 显示全部楼层
呃...书...
在接触JASS以前从没接触过任何编程语法...
对这方面是一点都不懂...
回复

使用道具 举报

一抹煞白 该用户已被删除
发表于 2009-3-12 12:22:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2009-3-12 12:26:39 | 显示全部楼层
引用第7楼灼眼のsaber于2009-03-12 12:07发表的  :
所以想问一下啊...
就是不太清楚 是否给触发器添加条件后,当不满足条件时会不会判断这个触发器

不运行触发器怎么确定,条件是否满足?

条件不满足不会运行触发动作,但触发条件是一定会运行的。
回复

使用道具 举报

 楼主| 发表于 2009-3-12 12:31:16 | 显示全部楼层
也就是说不管是用TriggerAddCondition给触发加条件,或是在动作里增加判断
当事件被触发时,这个条件一定会被判断到
不同的只是在触发后判断是否做动作,或是触发后做动作时判断执行哪些代码
对么?
回复

使用道具 举报

发表于 2009-3-12 12:52:07 | 显示全部楼层
触发了当然要去判断条件的
触发了首先去执行条件,返回真了再去执行动作

刚才的回答似乎有点像当然了,不过我仍然觉得未必是合并来的快,因为条件本身的执行效率要比动作高得多,老狼以前做过测试的
分开判断的话由于同时满足的最多只可能是一个条件,其他的都为假,这样动作也就掠过了
而合并的话则需要在动作中作二次判断,效率也就下降了吧
回复

使用道具 举报

 楼主| 发表于 2009-3-12 13:50:43 | 显示全部楼层
嗯...不过考虑到载图速度和代码量...决定合并之
回复

使用道具 举报

发表于 2009-3-12 18:20:16 | 显示全部楼层
个人认为,代码执行效率方面,在条件或在事件中应该是相同的。
不同的在于,动作执行时,需要创建一个“动作”的东西。创建这个东西需要消耗一定的资源而已。
相对的,一般不需要非常多的动态创建的触发器时。动作和条件的区别非不会造成非常大的影响。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-21 18:17 , Processed in 0.036409 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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