找回密码
 点一下
查看: 3781|回复: 22

一个关于DataSystem 和VJass的高级问题

[复制链接]
发表于 2007-11-17 12:21:11 | 显示全部楼层 |阅读模式
据说,Vjass是通过数组来模拟“类”的,但是关于handle---Index实际上缺乏一个有效的管理,它直接导致一个严重后果:

游戏是不可存储的

那么,应该如何开发“可存储”的数组模拟系统呢?

欢迎大家讨论。
--------------------------------------------
资料:StoreXXXX的函数操作出奇的缓慢,大概在一条函数中重复出现1000次左右就会导致函数无法正常结束,但是游戏中可以正常保存的数据好像只有UnitUserData,ItemUserData,以及有变量指向的结构等。
---------------------------------------------
不信的话可以下载任何一个vjass演示,然后启动一个需要Timer的效果,保存,读取的时候会弹出来的。
发表于 2007-11-17 12:53:52 | 显示全部楼层
DataSystem好像是我写的.

对于单位,物品,可以用userdata来存放一个结构的指针.
对于timer,trigger,group或是其它一些东西,因为一个地图,不可能有8000个动态timer或是动态trigger同时运行.
采用一种垃圾回收机制,保证新产生的,会仅可能的利用可用存储空间.

比如,我建立一个这样的对应关系:
一个timerdata,建立一个从timer到integer的映射,关系:       x------->x-198726
那么,想找timer--198800的对应timerdata,数据的84位就是了.

系统的关键是保证变量生成的可控制性.

比如,在handle的:
198800------------203362是产生timer的区域,
203380-------------210012是生产trigger的区域.

那就要保证,每一个新生成的timer,都要落在timer区域中,每一个trigger,也要落在trigger中.这样才能保证数组下标的合法化.

这个技术我自己都不在使用了.    在U9方面,相关下载我都删了.
回复

使用道具 举报

发表于 2007-11-17 13:01:15 | 显示全部楼层
hmm。如果使用H2I和I2H之类的函数。是不能保存地图的。
因为如果地图重新载入。这个handle值是会不同的。如果直接读取。是会出错的。
回复

使用道具 举报

发表于 2007-11-17 13:05:52 | 显示全部楼层
地图初使化时,会知道如何控制这个范围.
当然这个范围,在地图初使化前是不可预知的.
但在初使化后,就是一个常量了.
所以,不存在楼上所说的"出错"一事.
回复

使用道具 举报

发表于 2007-11-17 13:21:47 | 显示全部楼层
hmm。偶说的不素啥datasystem。偶说的是通常情况下。现在大多数使用的方式都是这样。
回复

使用道具 举报

 楼主| 发表于 2007-11-17 17:04:15 | 显示全部楼层
DataSystem说白了就是一个使用“伪指针”的一个东西,不管如何,反正我听说vjass的主要意思就是从这个发展来的。

实际上这个问题又是基于war3使用的TriggerSleep和war3进程并不同步(可能sleep用的是系统时间)来的,不然也不会有H2I的广泛应用。

不过如果你之前创建了一个全局变量用来指向某个handle,在读取后仍然会有这么一个全局变量存在,也对应一个handle,只是新建立的,不能像第一次创建那么简单地索引而已。
-----------------------------------
现在这玩意需要的是一套完整的索引方案,只要这个方案够完备那么就可以实现保存后的正确索引。
-----------------------------------
注:DataSystem只是一个思想,意为索引数据组。
回复

使用道具 举报

 楼主| 发表于 2007-11-17 17:05:38 | 显示全部楼层
当然也可以理解为"Struct"
回复

使用道具 举报

发表于 2007-11-18 10:24:11 | 显示全部楼层
Vj实际上是静态控制
穷举全局变量实现的
大部分操作都被封装了
不过Jass2这东西,封不封装都一样
回复

使用道具 举报

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

使用道具 举报

发表于 2007-11-18 12:30:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-11-18 15:07:37 | 显示全部楼层
个人觉得你们说VJ的不一定懂VJ

struct   MyTimer
              real   timer_real
              timer t
endstruct

给出一个MyTimer,你能找到这里面封装的timer变量.
但是,给你一个timer变量,如何找到被哪一个MyTimer封装才是问题的所在.

一种办法是建红黑树.           可以考虑用"location"变量来处理.
因为location正好有x,y,z 三个值,可以一个做左指针,一个做右指针,一个数据指针.      只是location的z值不太好设置,要用可跟踪物体来做.
回复

使用道具 举报

发表于 2007-11-18 20:13:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-11-22 10:26:35 | 显示全部楼层
vjass这个也叫封装啊。。。也就是做了一个公用结构体嘛。

在不能实现正常保存之前一切都是假的。。
回复

使用道具 举报

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

使用道具 举报

发表于 2007-11-22 14:17:36 | 显示全部楼层
location...camera...
你们好渣,好好的cache放着不用,拐来拐去然后找了这么些低效的东西......
回复

使用道具 举报

发表于 2007-11-22 14:22:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-11-29 13:19:49 | 显示全部楼层
我是这样做的:初始一个整数全局变量如 integer data_ttl = 0,每添加一个实例,就把 data_ttl 加 1。并且把这个数字储存起来。

当实例不再用的时候,首先把它删除,然后把所有实例中的最后一个挪到当前实例的位置,也就是:

[codes=jass]
set data = data[data_ttl-1]
[/codes]

这样我不但能随时调用需要的数据,程序还可以自己控制所有实例,不用的时候,删除之,添加的时候,data_ttl 加 1。

注:我最近做的《星际部队》使用的就是这样的方法,所有技能均可以多人使用,而且长时间玩不会卡机。
回复

使用道具 举报

 楼主| 发表于 2007-11-29 14:39:33 | 显示全部楼层
最近做出了完美的烈焰风暴和英雄智力挂钩。。。。
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2007-12-1 13:53:04 | 显示全部楼层
诺,这个。。。

泄露没弄干净(好像是因为boolexpr的原因)

LostTemple_C_Wow.rar

342 KB, 下载次数: 16

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 03:28 , Processed in 0.141248 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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