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

[原创]VJass的struct的分析(实现and优缺点)

[复制链接]
发表于 2008-8-22 11:33:17 | 显示全部楼层 |阅读模式

来GA还没发过啥有价值的东东 ..
要去大学了
以后可能没啥空来了(至少1个月吧)


其实我以前也很喜欢用那个东西
去工具区翻翻Jasshelper我H化了几个版本就知道了
只是后来发现
很多时候直接用数组+自己的算法更方便
不要误解啊
我没说struct不好
只是有时候很多数组算法比这个方便多
可以直接用数组的时候没必要用struct

分析下实现吧
只是分析struct的最基本功能 其他的自己想想就知道怎么实现的了

我们定义个struct
[jass]
struct hkeTri
    trigger tri
    triggercondition cond
endstruct
[/jass]
看看生成了什么

其实是一个类似链表的系统
我们知道struct传递是用integer
其实只是传递一个引索
然后调用相应数组

全局变量嘛
[jass]
constant integer si__hkeTri=1//干啥的捏...
integer si__hkeTri_F=0//最后一次的清除东东
integer si__hkeTri_I=0//引索
integer array si__hkeTri_V//储存指针
//下面两个就不用说了吧
//我们定义的东东
//嗯 看到了吧 其实是数组 这也是struct不能有数组变量的原因 JASS不支持多维数组嘛
trigger array s__hkeTri_tri
triggercondition array s__hkeTri_cond
[/jass]


函数
[jass]
//分配 hkeTri.create()
function s__hkeTri__allocate takes nothing returns integer
local integer this=si__hkeTri_F//把新指针设置成最后清楚的引索
      if (this!=0) then //上次清除的引索不为0(就是清除过)
            set si__hkeTri_F=si__hkeTri_V[this]
//最后清楚的东西设置成这个引索 等下能找到避免浪费空间
      else//为0 就是说之前没有空的 分配个新的
            set si__hkeTri_I=si__hkeTri_I+1 //设置成这个引索然后总数+1
            set this=si__hkeTri_I
      endif
      if (this>8190) then //超过数组最大数量则失败
            return 0
      endif

      set si__hkeTri_V[this]=-1 //标记
return this
endfunction
[/jass]

于是
每次create返回个integer
就是个数组的引索(假设返回123)
hkeTri.tri就是s__hkeTri_tri[123]
hkeTri.cond就是s__hkeTri_cond[123]
所以说白了还是数组

分配空间基本上看懂没问题吧
不明白先继续看

[jass]
//销毁 hkeTri.destroy()
function s__hkeTri_destroy takes integer this returns nothing
      if this==null then//空的就不清理了
            return
      elseif (si__hkeTri_V[this]!=-1) then//链表前端没有指针
            return
      endif
      set si__hkeTri_V[this]=si__hkeTri_F//设置新的指针
      set si__hkeTri_F=this//设置新清除引索
endfunction
[/jass]

这下稍微迷茫了吧
语法看懂很容易
但是算法不是很好理解

si__hkeTri_V数组其实存的都是指针this为引索取得上个数据的引索
-1表示这个没有指向其他东东
不理解为啥有这个东西存在的必要吧
如果destroy一次再create这个东西完全是不必要的
但是如果destroy很多次呢
为了保证之前每个引索都不浪费掉
把si__hkeTri_F存在以自己编号为引索的si__hkeTri_V里面
si__hkeTri_F再设置成自己的编号
下次用这个编号取si__hkeTri_V的内容就能取得上次存入的si__hkeTri_F
如此循环就形成个类似单向链表的东东
想起create时候set si__hkeTri_F=si__hkeTri_V[this]了吧

这样就能一直取回之前存下的空位
于是引索一个都没浪费掉
完全用满
除非之前没空位才返回新引索

===========袋鼠的分割线=============

好吧 实现上分析玩了
好处呢
如果这个struct要在多处被使用
显然是很方便的 只需要个integer记录引索
都公用一套函数和全局变量
用完清理及时的话一个位置都不会浪费

但是你也看到
用了数组还有个额外的存链表指针的东东
destroy只是标记可用而已
并没真正清理 当然这个对效率的影响基本可以忽略
但是vj毕竟不是官方代码
编译时候偶尔也会有些莫名其妙的问题
而且不直观 有些地方不好自己修改
而且那些支持VJ的WE多多少少也会有些麻烦的地方
(等工程做大了 想改回来你会很爽的)
如果你的数据规则或者不需要顺序什么的显然有很多更好的算法
而且知道了struct的实现我们完全可以自己写代替他

早上睡起来迷迷糊糊的
打错啥偷偷告诉我下


最后
刮奖啦->
看完迷糊奖

评分

参与人数 1威望 +32 收起 理由
kook + 32 迷糊奖~

查看全部评分

恶声恶气 该用户已被删除
发表于 2008-8-22 12:04:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2008-8-22 12:28:35 | 显示全部楼层
我对LZ的
但是你也看到
用了数组还有个额外的存链表指针的东东
destroy只是标记可用而已
并没真正清理 当然这个对效率的影响基本可以忽略

极为感冒。
貌似…………是声明一种Struct,就有一个全局变量(Integer)会不能消除吧………………


(顺便支持  【(等工程做大了 想改回来你会很爽的)】  这句话,我可是勇敢到把>=600行的一个系统,改了N次的家伙N>=10,这其中的苦难………………还是不说了………………)
回复

使用道具 举报

发表于 2008-8-22 12:30:04 | 显示全部楼层
不过,能像LZ一样这么精细的提供资料,顶N*N下。
回复

使用道具 举报

发表于 2008-8-22 13:25:06 | 显示全部楼层
本来想学下VJ的,看完这个竟没兴趣学了
回复

使用道具 举报

发表于 2008-8-22 13:25:19 | 显示全部楼层
看懂了

赞一个
回复

使用道具 举报

 楼主| 发表于 2008-8-22 14:04:44 | 显示全部楼层
引用第4楼actboy168于2008-08-22 13:25发表的  :
本来想学下VJ的,看完这个竟没兴趣学了
VJ不仅仅有struct嗯
我只是分析struct而已
引用第2楼血戮魔动冰于2008-08-22 12:28发表的  :
貌似…………是声明一种Struct,就有一个全局变量(Integer)会不能消除吧……………….......
显然不仅仅是一个Integer而已
多了好多东西
回复

使用道具 举报

发表于 2008-8-22 14:08:55 | 显示全部楼层
但用XX.destroy()清楚以后呢?
回复

使用道具 举报

 楼主| 发表于 2008-8-22 14:10:43 | 显示全部楼层
引用第7楼血戮魔动冰于2008-08-22 14:08发表的  :
但用XX.destroy()清楚以后呢?
说了啊
只是标记了可用而已
内容并没清除
而且魔兽本来也不能清理数组吧
而且链表本身也是数组
也是清除不掉的
回复

使用道具 举报

发表于 2008-8-22 14:13:16 | 显示全部楼层
………………………………
看来……………………ReturnBug+GameCache还是王道啊………………
回复

使用道具 举报

 楼主| 发表于 2008-8-22 14:14:56 | 显示全部楼层
引用第9楼血戮魔动冰于2008-08-22 14:13发表的  :
………………………………
看来……………………ReturnBug+GameCache还是王道啊………………
ReturnBug+GameCache浪费的资源显然比这个多多了
缓存速度也明显比变量慢

不要误解啊
我没说struct不好
只是有时候很多数组算法比这个方便多
可以直接用数组的时候没必要用struct
回复

使用道具 举报

发表于 2008-8-22 14:21:09 | 显示全部楼层
谢谢,我又安心了(要不然我又要把>=600行的系统改一遍了)……………………
顶你!!
回复

使用道具 举报

发表于 2008-8-24 18:31:35 | 显示全部楼层
其实我学vj前就用struct的原理作图了。。但明显struct还是比较好的
回复

使用道具 举报

 楼主| 发表于 2008-8-29 21:37:31 | 显示全部楼层
借地备份下东西

000.rar

211 KB, 下载次数: 51

1.rar

6.28 MB, 下载次数: 47

DI08.rar

3.27 MB, 下载次数: 50

MoviePlayer.rar

1 KB, 下载次数: 48

回复

使用道具 举报

发表于 2008-9-24 11:09:46 | 显示全部楼层
高明,又学到了种很有用的算法!
回复

使用道具 举报

发表于 2008-9-26 16:08:11 | 显示全部楼层
warcraft的地图脚本语言还能做大的工程?
我第一张图就是手写了1W行以上的j
这1W行直接就把我这辈子做地图的兴趣写没了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 07:55 , Processed in 0.117173 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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