魔兽地图编辑器吧 关注:65,186贴子:3,838,360

【科普】YDWE自定义值的原理

只看楼主收藏回复

YDWE的自定义值的本质是哈希表(在120下是GC,不过120应该快灭绝了吧),相信很多人都知道。但他又不单单是哈希表这么简单。
先看一个例子
local unit u = GetTriggerUnit()
call YDUserDataSet(unit, u, "力量", integer, 100)
这是在转为自定义代码里看到的效果,但当你实际保存之后,你会发现代码会变成这样
call SaveInteger(YDHT, GetHandleId(u), 0x30FA192C, 100)
如果用哈希表写,应该怎样写呢,大概应该有三种写法吧
call SaveInteger(YDHT, GetHandleId(u), StringHash("力量"), 100)
call SaveInteger(YDHT, GetHandleId(u), 1, 100)
call SaveInteger(YDHT, GetHandleId(u), '+str', 100)
第一种写法,StringHash有运行时的性能消耗,而且还会让字符串池增加了一个字符串,是性能很差的写法。
第二种写法,性能和自定义值相同,但是可读性较差,你只能通过注释或者自己的记忆来记住这是什么东西。
第三种写法,性能和自定义值相同,可读性也不错,在你英文还行的前提下,不过限定4个英文字母,所以表达能力有限。
总的来说,YDWE的自定义值和用Jass裸写哈希表比,性能一致或更好,可读性应该是最好的。
不过YDWE自定义值并非是为写Jass的人准备的,如果是用Jass来写YDWE自定义值,还可以简化一些。
比如描述u的类型unit,实则只需要关心u是不是handle(因为所有的handle都是用GetHandleId来转为整数),所以是可以省略的。
YDWE自定义值的缺点?
YDWE自定义值的局限性在于第三个参数(也就是“力量”)必须是常量,这样YDWE才可以在编译时简化掉字符串。加这个限制也正是为了性能的考虑。所以我也正在考虑加一个变量版的自定义值,这样功能就和哈希表完全一致了,同时使用变量版的自定义值,你就需要考虑上面三种哈希表写法所面临的问题。


IP属地:广东1楼2018-11-07 22:25回复


    来自Android客户端2楼2018-11-07 22:42
    回复
      广告
      立即查看


      来自Android客户端3楼2018-11-07 22:42
      回复
        <?=StringHash("力量")?>
        不是有预处理么,不过确实在GUI那里会有一点难看和麻烦


        IP属地:广东4楼2018-11-07 23:23
        收起回复
          来嘲讽一下,菜鸡依然看不懂,看得懂的早就知道了系列。曾经也用过4楼的办法,后来我选择了方法2


          IP属地:广东来自iPhone客户端5楼2018-11-08 00:10
          收起回复
            功能的话用define+lua可以实现,但是没有GUI的支持还是没啥用,所以期待更强大的GUI


            IP属地:广东6楼2018-11-08 00:10
            回复
              不明觉厉


              IP属地:上海7楼2018-11-08 01:09
              回复
                看了一眼ydwe的丝带系统 全是你所说的最差的写法 甚至更差 第一个handle也被求了hash


                IP属地:上海9楼2018-11-08 05:10
                收起回复
                  广告
                  立即查看
                  一直用的第二种,记忆起来的确是需要各种辅助方式来记忆的


                  IP属地:美国来自Android客户端10楼2018-11-08 05:30
                  收起回复
                    变量记录第三个参数然后调用,可数组,说起来就算hash一下也基本不影响效率,


                    IP属地:北京来自Android客户端12楼2018-11-08 09:44
                    回复(3)
                      所以用那任意三种方法都能在封装自己的T的时候使用到逆天自定义值吗?


                      IP属地:上海来自iPhone客户端13楼2018-11-08 10:36
                      收起回复
                        怪CK


                        IP属地:北京15楼2018-11-08 12:30
                        回复
                          就等这个变量的了。现在自己封一个类似的变量的自定义,但用起来还是麻烦。
                          还有想问一下,自定义值使用有上限吗,上限会是多少,过多会如何


                          IP属地:广东来自Android客户端16楼2018-11-08 13:20
                          收起回复
                            最近好无聊,问个问题啊。为啥我的做的地图有lua语句的不可以在游戏地图里面使用啊


                            IP属地:四川来自Android客户端17楼2018-11-08 16:43
                            回复
                              广告
                              立即查看
                              反正很蠢


                              18楼2018-11-08 17:18
                              回复