找回密码
 点一下
查看: 3964|回复: 42

没办法,只好到水区发贴请教了。

  [复制链接]
发表于 2007-6-29 01:03:49 | 显示全部楼层 |阅读模式
缓存保存局部变量,结果弄得变量本身和缓存的string标签都要处理。
所以,我想知道全局变量里的array会不会泄露呢?

我到想建立一堆全局array,再建立一个函数系统,来实现和缓存一样的功能,
同时又免去缓存的缺点。
发表于 2007-6-29 01:12:17 | 显示全部楼层
嗯。很好。
只是数组容量只有8000个左右。
回复

使用道具 举报

 楼主| 发表于 2007-6-29 01:45:40 | 显示全部楼层
这无关紧要。因为用VJass,全局数组随时就可以生成几个。
8192的容量也不小。
回复

使用道具 举报

发表于 2007-6-29 09:28:41 | 显示全部楼层
嗯。很好。其实偶也有这样的想法。只是太懒了。
可以给楼主我的一些简单的想法。或者说,楼主其实已经想到了。

比如,对于把单位和计时器挂勾。
可以使用两个数组,单位数组和计时器数组。
然后存的时候,循环单位数组。如果第一个位置的单位是空的。那便把单位设置到第一个数组元素中。
接下来,再把计时器也设置到计时器的另一个数组中的同样索引的位置。
取出的时候。也是循环判断单位数组中的某单位的位置。然后把此位置对应索引的计时器数组返回。
然后设置单位数组的这个位置为空,顺便把计时器数组同样位置的无素也设置为空。

虽然看起来很好,很完美。
但是,不得不说的是。
JASS中没有同步的概念。比如在设置单位的时候,要循环判断数组哪个位置是空的。而这个时候,也有另一个触发几乎是同时调用的这个方法,这时,刚好两边都同时判断出X位置的单位是空的。两边都存入同一个位置。那一定是不行了。
或许这样的机率比较小,那么另一种可能性是这样:当取出计时器之后,设置单位为空,接着设置计时器为空。或许,单位刚设置为空,另一个触发刚好存进一个单位,这时又顺带设置了计时器,接下来才继续设置计时器为空。那么,下次取出来的时候也都素空鸟。当然,可以选择不清除计时器数组中的元素。

最后想提一下,追求完美是很好的,但是现实是完美需要付出的代价和所得到的价值不成正比。
在当前的情况下,使用缓存所生成的字符串是有限的。而且占用的内存也是有限的。当然也会有一定的影响。
但是在性价比方面,使用缓存比较简单,虽然损失了一些性能,但是对于现在的机器来说,根本不是问题。

如果地图在退出的时候比较慢,大家称为“内存泄露“,其实这里面相当一大部分是由“点”引起的。这和字符串相比,那才是“大巫”啊。

简单的说,以单位H值存到缓存,因为缓存有“分类”这个东西,所以完全不需要组合:“单位123456“这样的字符串做为名字,完全可以使用"单位“分类,下面直接用"123456“做索引。
1234567890 十位数,最大的可能了。JASS中所有东西的H值都不会超过这个吧?
那么。如果你的地图中有5W个这样的东西。
那便是10*5W = 50W。 50W/1024 = 48x KB。
就这些东西,能占多大内存?再翻一倍。10W个。那也才1M的内存空间。

嗯嗯。这个就是个人对缓存的看法。
回复

使用道具 举报

 楼主| 发表于 2007-6-29 11:54:31 | 显示全部楼层
至少,多个单位与多个计时器挂钩呢,或是多个单位同时和很多东西挂钩,里面有单位,计时器,还有trigger,item,integer,real,等等。

还有一个就是检索的时间开销,如果不知道单位在数组的哪个位置,就要从一头找,感觉很费时间。

我的方法是为每一个类型建立两个数组,一个里面放数据,一个里面放一个整数x。

再为每个类型建立3个整型数组,为别为A,B,C。再建一个数组D。数组B,C中的A同步的地方存放两个整数,指向D中两个位置,是A中索引(指向上面的类型数组)数据的关联数据。

举一例:
-----索引----数据-------------
数组1:    24----大法师(11,到15也有数据)
数组2:    24----97

数组A:    97----24
数组B:    97----11
数组C:    97----15
数组D:  11----一个单位的索引
                   12----同上
                   13----同上
                   14----同上
                   15----同上

这时,大法师就与数组的11到15的所有数据关联了。不过,这只是一个简化版本。

再写一个函数,是存放类型的,返回值是数组的索引。
回复

使用道具 举报

 楼主| 发表于 2007-6-29 12:04:56 | 显示全部楼层
不过只有ExeFunc和Timer无法传参,但这两种东西很实用,只为这两种类型写就简单一些了。
回复

使用道具 举报

发表于 2007-6-29 12:09:09 | 显示全部楼层
555。好深奥。偶果然看不懂老。
楼主加油吧。
回复

使用道具 举报

 楼主| 发表于 2007-6-29 12:18:48 | 显示全部楼层
发现你钱还是很多的。负威望清0的东东也不贵啊,买一个吧。不然多没面子。
回复

使用道具 举报

发表于 2007-6-29 12:22:05 | 显示全部楼层
面子这种东西生不带来死不带去的。
回复

使用道具 举报

发表于 2007-6-29 12:24:20 | 显示全部楼层
嗯,技术帖,留个记号在这里
回复

使用道具 举报

 楼主| 发表于 2007-6-29 13:12:56 | 显示全部楼层
引用第8楼amp34于2007-06-29 12:22发表的  :
面子这种东西生不带来死不带去的。
我把我有限的那点钱都捐给黑帮了,后来发现,白银大人存款都快溢出了。
回复

使用道具 举报

发表于 2007-6-29 13:14:14 | 显示全部楼层
一切都素那浮云啊浮云...............
回复

使用道具 举报

发表于 2007-6-29 15:26:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-6-29 16:21:07 | 显示全部楼层
个人认为。楼上的方法完全没有意义。
首先不说这个除1000以后的数是多大。
最主要的是。StoreI根本不需要出现。
因为StoreI中的内容其实是一个常量的集合。
其实就是1000的倍数。
这是因为单位的H值会在一个固定的范围内。
打个比方:
如果单位A的H值是10001。
单位B的H值是1001。
计时器1的H值是100001。
计时器2的H值是100002。
那么。按照楼上的函数:
(以下简称StoreI为S1 StoreII为S2)
第一次存入单位A时,在S1[100]中的值为10。
第二次存入单位B。这时。在S1[100]中的值为1。
如果接下来读取单位A的时候。获取到的值就是单位B——1001了。

所以。以上的函数根本不需要使用两个变量来存放这些值。
只需要得出单位最小H值。然后减去这个数,再保存。取出的时候再加上这个数就可以了。
简单的说,以上的函数完全是建立在timer的H值和unit的H值都固定在相同的范围内,才会生效,而且记录的只是一个常量,根本没有意义。

以上。
回复

使用道具 举报

发表于 2007-6-29 16:24:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-6-29 18:33:08 | 显示全部楼层
引用第13楼amp34于2007-06-29 16:21发表的  :
个人认为。楼上的方法完全没有意义。
首先不说这个除1000以后的数是多大。
最主要的是。StoreI根本不需要出现。
因为StoreI中的内容其实是一个常量的集合。
其实就是1000的倍数。
.......
我也一样反对everguo,那堆代码MS。。。。。。。。。。(不敢说了)
至少无法替代缓存。
回复

使用道具 举报

发表于 2007-6-29 18:36:05 | 显示全部楼层
很明显。不用和他客气。
因为他认为你说分两个数组。所以他就理所当然的以为是和这个使用两个数组的差不多。
但是他自己根本就没理解楼主说的是啥。
当然。我自己也不知道楼主说的啥意思,太深奥鸟。
回复

使用道具 举报

发表于 2007-6-29 19:48:23 | 显示全部楼层
  [s:75] 太牛B了,太强大了,太帅了..不知我什么时候才到这种水平....
回复

使用道具 举报

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

使用道具 举报

发表于 2007-6-29 20:31:07 | 显示全部楼层
偶像发飙了....
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-4 17:35 , Processed in 0.042249 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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