找回密码
 点一下
查看: 3035|回复: 13

一个绑定数据的方法

[复制链接]
发表于 2010-8-13 10:44:14 | 显示全部楼层 |阅读模式
听说gamecache慢。。。所以想了个笨方法出来。。。把树型结构分拆成线型结构
我觉得如果只是要动态绑定和读取数据的话,尤其是对于单独的一张图或一个系统,需要临时绑定的数据也不会超过几十,所以以下的方法也可行啊?
我没有进一步的测试,不过我觉得用这种方法完全可以定义出你自己的表单结构,二维的三维的甚至更多,存储整数的,字符串的都可以。。。如果可行的话,这应该比gamecache快吧?
  1. globals
  2. integer udg_size=0
  3. string array udg_Sort
  4. string array udg_List
  5. integer array udg_Content
  6. endglobals
  7. //Store Data
  8. function StoreContents takes string sort_title,string list_title,integer contents returns nothing
  9. set udg_Sort[udg_size]=sort_title
  10. set udg_List[udg_size]=list_title
  11. set udg_Content[udg_size]=contents
  12. set udg_size=udg_size+1
  13. endfunction
  14. //Get Data
  15. function GetContents takes string sort_title,string list_title returns integer
  16. local integer i=0
  17. local integer tmp=0
  18. loop
  19. exitwhen(i>udg_size)
  20. if(udg_Sort==sort_title)then
  21. if(udg_List==list_title)then
  22. set tmp=udg_Content
  23. return tmp
  24. endif
  25. endif
  26. endloop
  27. return 0
  28. endfunction
  29. //Return Bug
  30. function H2I takes handle h returns integer
  31. return h
  32. return 0
  33. endfunction
  34. //A Test Func
  35. function func_test takes nothing returns nothing
  36. local integer tmp
  37. call StoreContents("missionkey","key",H2I(Player(0)))
  38. set tmp=GetContents("missionkey","key")
  39. call DisplayTextToPlayer(Player(0),0,0,I2S(tmp))
  40. endfunction
复制代码



嗯,再添一个restore的函数,  
  1. function ReStore takes string sort_title,string list_title,integer contents returns boolean
  2.   local integer i=0
  3.   local integer tmp=0
  4.   loop
  5.     exitwhen(i>udg_size)
  6.     if(udg_Sort==sort_title)then
  7.       if(udg_List==list_title)then
  8.          set udg_Content=contents
  9.          return true
  10.        endif
  11.     endif
  12.   endloop
  13.   return false
  14. endfunction   
复制代码
发表于 2010-8-13 10:55:29 | 显示全部楼层
因为数组上限是0-8191于是悲剧了
回复

使用道具 举报

 楼主| 发表于 2010-8-13 11:57:44 | 显示全部楼层
我看别人做的系统里,用到gamecache的地方也不是非常多啊?
存储的数据missionkey数*key数能超过几百?那样缓存访问速度才是个悲剧。。。
而且我写了个restore的函数啊,可以循环利用,不用超数组上限那么恐怖吧。。。我看很多数据都只是需要绑定了,存储了,利用了,然后就没用了。。。
回复

使用道具 举报

发表于 2010-8-13 12:03:37 | 显示全部楼层

Re:我觉得这样绑定数据也可行啊?

你这样还不是不能在1.24下使用么- -有意义么- -一般如果是在1.20下,都是自己用数组构建一个HASH函数的,效率更高些
回复

使用道具 举报

 楼主| 发表于 2010-8-13 12:37:18 | 显示全部楼层
LS,我才学JASS,只是学到gamecache时有点想法。。。我不知道哈希表的原理是什么,在论坛里搜也没搜到教程。。。给个教程的传送门吧?
回复

使用道具 举报

发表于 2010-8-13 19:11:17 | 显示全部楼层
hashtable有教程的,手机不好搜索,作者是综合区路人小血,以这个搜索吧
回复

使用道具 举报

 楼主| 发表于 2010-8-13 20:55:19 | 显示全部楼层

回 5楼(疯人¢衰人) 的帖子

谢谢楼上。。。我以前输的“哈希表”所以没搜出来。。。
只是我把War3升级到1.24b版本,然后重新从里面导出三个脚本文件并在jasscraft里面重新设置了语法检查,但是jasscraft还是检测不出有关hashtable的函数和变量啊?要怎么做才能在jasscraft顺利编写和利用hashtable的函数呢?
回复

使用道具 举报

发表于 2010-8-13 21:16:21 | 显示全部楼层
哈希是一个传说,不要迷恋它。如果你愿意,你可以指着下面这些东西说:“这就是哈希!”
[jass]function foolhash takes integer i returns integer
return i-i/8190*8190 //取模
endfunction

function foolhash_2 takes integer i returns integer
real r=i/0.36294678 //被除数随便填,无理数最好
return  R2I( (r-R2I(r))*8190 )
endfunction

//仅是随手胡写的两种方法,构造哈希函数其实很随意[/jass]
但是你发现foolhash(123+8190*1)和foolhash(123+8190*11)得到的结果会一样,这种情况叫做冲突。
这就需要略施小计来规避下...
不妨看下这个http://baike.baidu.com/view/20089.htm#7_3

至于楼主写得这个,不知道是遍历还是什么的,当储存量多了以后会越来越慢,而哈希函数寻址速度并不会因为储存量多少有明显的变化,也就是gamecache或者是hashtable号称的无限容量和稳定速度的原因。不过gamecache会因为字符串泄漏原因用多了也慢,慢多少咱就不知道了...
[jass]//恶搞下... HT和GC的奸情
function StoreInteger takes hashtable ht, string mKey, string key, integer val returns nothing
call SaveInteger(ht,StringHash(mKey),StringHash(Key),val)
endfunction[/jass]
回复

使用道具 举报

发表于 2010-8-13 21:25:34 | 显示全部楼层

回 6楼(truenight) 的帖子

把1.24的BJ和CJ放到jasscraft文件夹里就好了
回复

使用道具 举报

发表于 2010-8-13 23:49:31 | 显示全部楼层
楼上说错,因为tab的问题,直接复制是不行的,需要替换成空格。
lz可以去工具区下载,我的1.24版或橙子的c#版都行,差别在于我的是原味的,而那个有扩展功能
回复

使用道具 举报

 楼主| 发表于 2010-8-14 10:44:22 | 显示全部楼层
靠,怪不得,昨晚我试了N遍。。。还以为是魔兽版本转换没成功。。。
嗯,搞定了,谢谢LS
好吧,我承认我写的是些乱七八糟惨不忍睹的东西污了你们的眼睛。。。不过blizzard的AI文件里setbuildall函数也是用的类似的方法。。。其实我最初只是想做一个任务系统来着。。。设置一个assignment字符数组标记地图里的所有任务,一个assign_state整数数组存储对应的任务状态(0未接受,1一阶进行中,2二阶进行中,3完成)。。。然后就可以显示隐藏物品,NPC特殊对话等等。。。不过,哎算了,好好学习下hashtable吧。。。
回复

使用道具 举报

发表于 2010-8-14 21:08:40 | 显示全部楼层
关于存储系统,没啥最好的,主要是适合自己使用,从总体来看,还是hashtable最好
回复

使用道具 举报

发表于 2010-8-15 10:26:13 | 显示全部楼层
hashtable要什么教程啊。

你会GameCache就会Hashtable了啊。
回复

使用道具 举报

发表于 2010-8-15 19:47:13 | 显示全部楼层
差别在于gc不能存储gc,而hashtable可以存储自己
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 01:36 , Processed in 0.037031 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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