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才可以在编译时简化掉字符串。加这个限制也正是为了性能的考虑。所以我也正在考虑加一个变量版的自定义值,这样功能就和哈希表完全一致了,同时使用变量版的自定义值,你就需要考虑上面三种哈希表写法所面临的问题。
先看一个例子
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才可以在编译时简化掉字符串。加这个限制也正是为了性能的考虑。所以我也正在考虑加一个变量版的自定义值,这样功能就和哈希表完全一致了,同时使用变量版的自定义值,你就需要考虑上面三种哈希表写法所面临的问题。