找回密码
 点一下
查看: 2028|回复: 9

关于触发器和内存的问题

[复制链接]
发表于 2007-10-11 20:22:46 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2007-10-11 20:39:26 | 显示全部楼层
函数本身不占内存.被Create的东西才占内存.
比如:  CreateTrigger,CreateTimer,Location

不过,函数里面循环层次太高的话,会影响运行效率,也就是CPU.
回复

使用道具 举报

 楼主| 发表于 2007-10-11 21:07:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-10-11 23:11:53 | 显示全部楼层
触发器动作也不占内存.不过对效率有影响.
我猜想Trigger使用的是Windows消息类似的东西.

触发呢,就是向系统注册一个要监听的消息,当这个消息发生时,运行这个触发的条件,当条件返回真时再运行这个触发的动作.
如此看来呢,触发器的注册是用内存的,因为要用一段内存保存这些东西.
触发条件和动作就不占内存了.(不过,动作里面有local变量另当别论)
Warcraft对Jass里面的函数有比较特别的运行机制,而且函数调用有一部分系统开销.  很多时候,触发的条件是用condition写的,而condition显然是用内存的.  如果手写代码,应该能少使用condition,并且把动作写到条件里去.(按老狼说,动作写到条件里去会提高效率,不过我也不知道原因)
回复

使用道具 举报

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

使用道具 举报

发表于 2007-10-12 17:33:13 | 显示全部楼层
任何一个东西都会占内存。只是有多有少的问题。
有一些根本不值一提的可以不需要。
不过如果有很多,达到一个量级的话,还是删除比较划算。
回复

使用道具 举报

发表于 2007-10-12 19:25:26 | 显示全部楼层
引用第4楼nnagou于2007-10-12 17:29发表的  :
想不到这样的啊……?
不过我倒是看有的教程说,local的触发器create后要删的,而且连动作也要删……
如果触发器动作不占内存为什么要删呢……
那是触发器条件,不是动作.
触发器条件占内存的,动作并不占内存.

删触发器,要先删条件,后删触发.
回复

使用道具 举报

发表于 2007-10-12 21:26:28 | 显示全部楼层
条件和动作都是占内存的
只要触发条件返回不为true,那么触发动作就不会被激活,而触发动作的激活是极占资源的
而事实上我们不激活触发动作就可以直接在Conds里面运行我们需要的动作(就如在timer中一样,不能用等待)

Condition函数无论运行几次,返回的值是一样的,所以不会造成内存泄漏
回复

使用道具 举报

发表于 2007-10-12 21:44:59 | 显示全部楼层
并没有觉得动作占内存.
比如一个触发是这样的,
触发器为triggerA,  我们想在条件condition成立里运行action,此时不按正常的办法生成触发,而是:

注册触发,注册条件,把条件里的return true前边都加上一行call Func_TriggerAction()
或是触发器没有条件,只有动作,把条件写在动作里.

如果触发器的动作里有一个耗时较长的loop+sleep,仅仅删除触发,并不能停止正在运行中的触发器动作,但此时有函数可以终止触发器动作的.    但是,把动作写在条件里,就没有办法终止这个loop+sleep了.


我还是觉得触发器动作耗CPU,并不占多少内存.而且,就算是占了,也没有什么办法清理.    因为,注册条件用了一个condition,是一个指针变量,注册动作用的一个code变量.   正常观点是,只有handle才占内存,并能理.
回复

使用道具 举报

发表于 2007-10-13 09:51:59 | 显示全部楼层
TriggerAction就是1 handle~~

条件里根本不允许sleep, 条件里sleep==return,和timer、组动作一样
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 21:46 , Processed in 0.046260 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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