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

再次探讨关于异步技能的问题,感谢zhuzeitou,希望再来看看。

[复制链接]
发表于 2008-2-22 22:40:01 | 显示全部楼层 |阅读模式
发了上一贴“关于异步技能的问题”,得到了zhuzeitou先生大力的帮助,实在感激不仅,也学到了很多知识。

在此想总结一下,请诸位高手予以指正。

我想,问题的关键的在于,执行魔法效果的函数需要得到触发函数的来的“区域”,并且该函数应该被动态的调用。

那么,zhuzeitou先生采用了GameCache用来存放动态创建的定时器动态创建的触发器

我突然想,动态创建的的那个触发器可不可以改成静态的。

触发器1:
     事件:当一个单位开始释放魔法
     条件:所释放的魔法是指定的魔法
     动作:创建一个定时器,指定动作为Function1将定时器句柄保存入GAMECACHE。
           将触发本触发器的单位ID为索引,创建的定时器句柄保存入GAMECACHE。
           将定时器句柄为索引,魔法目标区域保存入GAMECACHE。
functon Function1 takes nothing returns nothing
          //获得GAMECHACHE中以定时器为索引的区域。
          //在特定区域中创建一个效果,删除该效果
endfunction

触发器2:
     事件:当一个单位停止释放魔法
     条件:所释放的魔法是指定魔法
     动作:获得GameCache中以触发单位ID为索引的定时器句柄。
           清除定时器
           清除相关GameCache中的信息。

请高手看看上面的模式可不可以??

另外,突发其想,既然具有return bug。可不可以这样用。为了提高速度。
不使用GameCache,而是使用单位里面的自定义数据。
使用XX2I来将所需要的东西保存到自定义数据中。
请问这种想法可以实现么?有没有前辈用过的。谢谢。

还有一个最主要的问题,问一下return bug存不存在这样一个漏洞:
     function H2I takes handle h returns integer
                 return h
                 return 0
     endfunction
看上去,上面那个函数很巧妙的将handle转换城了integer。但是,handle是什么?其实handle是一个指针,他指向的是一个可能比较复杂数据结构,把他直接转化为integer,其实是获得指针的值。

那么,你看~~,如果handle是一个local型的数据,它的生命周期是局部的,如果把它转换为integer并且保存了,在其他函数中使用时,也许handle已经过期了。那么会出现什么情况????那么,就会访问并不存在的数据,如果要赋值的话,情况可能会更严重,可能会把不该覆盖的数据覆盖了。也许会导致WarIII崩溃。。。。。。

举个例子:
   function some function................
             local handle a
             //...........some code ...............
             save to gamecache( H2I( a ))
   endfunction

   function some function...................
             local handle a = I2H( LoadFromGameCache( .... ))
             //some codes ............
             a = ..........//a 还有效么???
   endfunction
不知道以上分析有没有道理???请高手赐教
发表于 2008-2-22 22:50:44 | 显示全部楼层
恩,关于那个用静态触发器,我觉得应该是可行的,因为一个单位只能在同时使用一次这个技能,可以用单位的handle作为索引的~~
lz可以试试看,期待成功~~
回复

使用道具 举报

 楼主| 发表于 2008-2-22 22:54:09 | 显示全部楼层
谢谢。。
回复

使用道具 举报

发表于 2008-2-22 23:20:13 | 显示全部楼层
handle并不是一个直接的指针
实际上它应该是war3中指向各数据结构的一个表的索引
它本身会过期,但是和这个索引相关的资源不会。
只要资源没有被释放,就一只都可以通过同一个值的索引来获得它。
回复

使用道具 举报

发表于 2008-2-22 23:24:11 | 显示全部楼层
学习学习了
感谢指教
回复

使用道具 举报

发表于 2008-2-23 01:04:11 | 显示全部楼层
既然具有return bug。可不可以这样用。为了提高速度。
不使用GameCache,而是使用单位里面的自定义数据。
使用XX2I来将所需要的东西保存到自定义数据中。
嗯,是可以的,其实还可以用单位自定义数据做成动态链表(利用Localtion),这里的JASS区置顶帖有索引,楼主去看吧
回复

使用道具 举报

发表于 2008-2-23 05:57:29 | 显示全部楼层
关于“多线程技能”,目前比较流行的有两种方式
标准的return bug 转化 gamecache转储,实际点就是一个新放的技能实例就造一个新的timer/trigger..在用过后销毁,一次性的。特点是可以大小通吃
只使用单一的timer/trigger,参加到技能里的元素以数组的形式循环处理,可以全部用全局变量,结构化的。特点是不用反复创建和删除对象,节省资源,理论上有较高的速度和处理效率,受到数组上限的制约

另外我还见过有一个很另类的,不知道怎么描述仿佛记得在触发技能时创建触发然后触发这个触发来作为这个技能实例的真实触发。。
回复

使用道具 举报

发表于 2008-2-23 06:05:57 | 显示全部楼层
顺便说一下,学这类结构找些现成的技能演示分析比较捷径,关于第2种做法可以搜索“宇宙兔子”的技能,我是跟他学的,当然也可以找我的,各种方法都有(打广告)
回复

使用道具 举报

traxex 该用户已被删除
发表于 2008-2-23 06:23:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

traxex 该用户已被删除
发表于 2008-2-23 06:25:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-5 23:09 , Processed in 0.049921 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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