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

随便聊聊关于timerstart、周期性事件、Timer到期事件。

[复制链接]
发表于 2009-10-16 01:28:41 | 显示全部楼层 |阅读模式
因为在疑难区看到所以随便提一下。


TimerStart - timerstart的function只能获得触发timer,无法获得触发器ID和事件类型ID,因为它并非一个传统意义上的触发器,不具备触发器一些的特征(甚至你也可以说它不是一个触发器,说它是触发器,是因为它能获得触发timer,符合事件响应机制;说它不是触发器,是因为它和普通触发器的运行方式都不一样)。

周期性事件 - 周期性事件只能获得触发器ID和事件类型ID,无法获得触发timer。

Timer到期事件 - Timer到期事件能获得触发器ID、事件类型ID、触发timer。




而实际上周期性事件的事件ID和Timer到期事件的事件ID是相同的,都是4,EVENT_GAME_TIMER_EXPIRED。所以周期性事件和Timer到期事件本质上是相同的,只是周期性事件使用的是游戏自建Timer,而且没有对jass开放而已。

因此,若要问周期性事件和Timer到期事件哪个效率高占用资源少?毫无疑问的是周期性事件,记住一点,对jass开放handle的对象总是比不对jass开放handle的同类对象占用更多的资源。然而Timer到期事件也有其优势,因为触发器ID事件ID触发Timer都占全了,而且可以随意改变事件的触发间隔,这点比周期性事件当然是方便。


然后timerstart的占用资源自然最少,但它不具备触发器的一些特征,比如无法获得事件类型ID,这样,一个函数要如何得知自己是被timerstart调用的还是被其他什么事件调用的呢?聪明人也许可以从另一个角度解决问题,既然无法获得事件类型ID,那么eventID和触发器ID自然都是0咯。符合这种状况的话,该函数自然就是被timerstart调用的。但是无法获得触发器ID这一特征使得它无法将任何需要触发器id作为参数的函数应用于自身。

另外要注意一个重点,timerstart所执行的function会忽略wait(即TriggerSleepAction())以后的部分。因此如果timerstart所执行的函数中有等待语句,那么等待后面的部分都不会被执行。(这点跟触发器里的条件部分很像)

此外,Timer到期事件和周期性事件由于可以获得触发器ID,就可以得到自身被执行的次数。这点用在一些周期性系统上很方便。而TimerStart的话就必须绑定什么变量来帮它记录了。
发表于 2009-10-16 10:42:36 | 显示全部楼层
周末复制一篇去我的地盘。
回复

使用道具 举报

发表于 2009-10-16 11:25:03 | 显示全部楼层
顶一下
回复

使用道具 举报

发表于 2009-10-16 13:53:58 | 显示全部楼层
补充:关于头目的部分说法存在问题
周期性事件《-----这个东西存在非常严重的泄漏,原理未知。

测试代码是启动100个0.01秒的周期事件,你会发现游戏的内存会无故变得很大

其实Timer是万能的。。。。

只要你的架构设计良好,任何东西都可以用timer控制
回复

使用道具 举报

发表于 2009-10-16 19:22:32 | 显示全部楼层
果然还是要完全解析War3才算高手呀!
回复

使用道具 举报

发表于 2009-10-17 00:10:40 | 显示全部楼层
难怪在TimerStart中不能直接执行触发器动作执行函数呢。
回复

使用道具 举报

发表于 2009-10-18 12:08:43 | 显示全部楼层

回 3楼(eff) 的帖子

..哦..我新建了100个 0.01周期。
发现内存看不出增减
回复

使用道具 举报

发表于 2009-10-18 12:12:22 | 显示全部楼层
在下来报到了!
回复

使用道具 举报

 楼主| 发表于 2009-10-18 14:15:57 | 显示全部楼层
引用第3楼eff于2009-10-16 13:53发表的  :
补充:关于头目的部分说法存在问题
周期性事件《-----这个东西存在非常严重的泄漏,原理未知。

测试代码是启动100个0.01秒的周期事件,你会发现游戏的内存会无故变得很大

.......

我不知道是你的电脑有问题还是你自己RPWT~~

下面两张图都是以同一张空地图为准的测试。

第一张截图是,进入地图等待内存占用稳定以后,为一个无动作的触发器创建100个0.01秒周期事件后内存占用(稳定后)。

2.PNG


第二张截图是,进入地图等待内存占用稳定以后,创造100个0.01秒的重复Timer,并将他们的到期事件注册给一个无动作的触发器后的内存占用(稳定后)。

3.PNG



谁多谁少一目了然。

顺便,这个地图在进入并等待内存占用稳定以后的基础稳定内存占用量是142,444。所以100个周期事件大约占用了668K内存,而100个计时器到期事件大约占用992K内存,都接近1M了。
回复

使用道具 举报

发表于 2009-10-18 17:12:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2009-10-19 09:12:35 | 显示全部楼层
原来你还活着啊,老兔子.
回复

使用道具 举报

发表于 2009-10-19 09:16:15 | 显示全部楼层
而且熟了
回复

使用道具 举报

发表于 2009-10-19 13:55:23 | 显示全部楼层
啊,前面有爆炸了?
回复

使用道具 举报

发表于 2009-10-19 14:14:24 | 显示全部楼层
恩恩……
回复

使用道具 举报

 楼主| 发表于 2009-10-20 21:07:45 | 显示全部楼层
爆炸年年有,今年特别多.
回复

使用道具 举报

发表于 2009-10-20 21:10:06 | 显示全部楼层
活力充沛啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-29 11:25 , Processed in 0.035928 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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