【梦话连篇】第四辑:灵台方寸,斜月三星——论心跳
本帖最后由 hijacker 于 2013-7-31 10:14 AM 编辑想知道最效率的打坐方法吗?
想知道为什么明明做好了alias见面就开杀却被对手先手pfm吗?
敬请期待华山剑客Jack疯言疯语为您解惑!
北大侠客行MUD,中国最好的MUD 本帖最后由 hijacker 于 2013-7-31 06:58 PM 编辑
忽回头,见崖头立一石牌,约有三丈馀高、八尺馀阔,上有一行十个大字,乃是“灵台方寸山,斜月三星洞”。美猴王十分欢喜道:“此间人果是朴实。果有此山此洞。”看勾多时,不敢敲门。且去跳上松枝梢头,摘松子吃了顽耍。
首先请注意:这不是技术文,而是理论文!
紧接着,感谢奸细巫师舒肤佳(两仪剑)的倾情卧底为我们带来“心跳”的官方解释:http://pkuxkx.net//forum/viewthread.php?tid=11619
了解了心跳的概念后,为了下面的深入理解,请原谅我很伪科学地画个数轴来帮助行文:
图1:
|----------|----------|----------|----------|-----> 单位:心跳
0---------1---------2---------3---------4
图1中,标注0、1、2、3、4的时间点就是“心跳”的时刻,下文称这样的点为“搏动点”。
我们通过一个简单的动作:dazuo,来了解在某个搏动点发生了什么事。选一个内功不错的id(就是在一秒之内能打坐完10个点的那种),输入dazuo 10,你会看到: dazuo 10 ……(1)
你坐下来运气用功,一股内息开始在体内流动。……(2) 被动反馈
你运功完毕,深深吸了口气,站了起来。 ……(3) 主动反馈 多输入几次dazuo 10感受一下,会不会觉得自己从坐下到站起的时间间隔似乎有长有短?这是因为(2)是紧接着(1)发生的,是对(1)的立刻响应,而(3)是在搏动点发生的。图2和图3是这个过程的示意图(注意为了更清楚地显示,这里把单个心跳的时间长度放大了):
图2:
|-----#--*--------------------|------->
0-----#--*-------------------1 单位:心跳
图3:
|------------------#---*------|------->
0-----------------#---*------1 单位:心跳
“#”表示(1)时刻(即输入dazuo 10指令的时刻),“*”表示(2)时刻(即显示“你坐下来运气用功,一股内息开始在体内流动。”的时刻),刻度为1的搏动点表示(3)时刻(即显示“你运功完毕,深深吸了口气,站了起来。”的时刻)。其中“#”和“*”的距离和网速有关,网速越快,距离越短。可以看到,虽然两图中的#时刻不同,#和*的距离也不同,但是(3)时刻是一样的。这就解释了刚刚提出的为什么“自己从坐下到站起的时间间隔似乎有长有短”的原因。
有的人在打坐时,因为自己网速比较慢,希望尽量减少从dazuo起身到下一次打坐之间的间隙,所以会一次dazuo很多气血,这其实是一个误区,小的间隙并不会拉低dazuo效率。除非你的网速慢到了响应时间大于1秒的极端情况,利用触发器,每次执行dazuo 有效内功/10+1是最效率的打坐方式之一。
有人会说:我不用触发器,我用计时器,每秒执行一次上面的指令,更稳定。稳定是不假,但是效率可不一定赶得上触发器。看下面的图示:
图4:
|---------------------#---|-*-------------------#-*-|---->单位:心跳
0--------------------#---1---------------------#---2
上图的例子中,两个指令输入(#位置)的间隔是标准的1秒;但是由于网速原因,导致两个被动反馈(*)的间隔小于1秒,也就是说二者在同一心跳区间内,这就导致第二个被动反馈的信息不可能是“你运功完毕,深深吸了口气,站了起来”,而是“你现在正忙着呢”,因为上一个打坐动作还没有遇到搏动点,没有结束。结果是会损失一个心跳的打坐效率。所以如果你一定要选择计时器,那么建议一般计时器的时间间隔以小于1秒为宜,时间间隔为1秒的计时器很可能因为网络延时的波动而浪费有效心跳。
最效率的打坐方式,我采取的方法是做一个触发器:#trigger {^??你运功完毕,深深吸了口气,站了起来} {dazuo 有效内功等级/10取整+1},另外辅以一个每分钟一次的计时器防止掉线后触发器罢工。或者单用计时器每x(x < 1)秒发送一次{dazuo 有效内功等级/10取整+1}也可以,但是不如前者节省系统资源。OK,打坐的事就先说到这里,这只是运用心跳知识的一个小例子。下面是更实用一点的,心跳和战斗。
心跳在MUD中是一个非常非常重要的概念,试着和NPC战斗并自己观察你会发现,NPC的只会在搏动点出招,而不可能在两个搏动点之间出招。这就好比普通的钟表的秒针,是每秒钟的某一个固定时刻“嗒”地一下子转过6度,而不是在这一秒钟的整个过程中平滑地移动过6度。每个搏动点,系统大致检查以下状态:buff / debuff(包括busy)时间到了没?CD结束了没?……也就是说状态的改变时刻也一定是搏动点。所以,完全没必要一刻不停地切武器、放pfm,一秒钟刷出n个屏幕,只需要一个执行频率略小于1秒的计时器即可。当然,以上说的是NK,PK的对象也是玩家,不会按照心跳出pfm,所以通过一刻不停地刷屏来争取先手还是极重要的。
==========以下内容属有根据推测,未经100%验证==========
再想想爬塔的时候,为什么自己网速很快、做好了触发和alias见面就pfm,却依然被wat武士抢了先?依旧是图示——
图5:
|-------------------#-$-|-*---------------------|-->
0 ^-*-----------------1-*--------------------2 单位:心跳
我们假设alias包括两个指令:{kill wushi;pfm},#表示和wat武士见面时刻和发送alias时刻,$表示系统收到kill wushi指令时刻,*表示系统收到pfm指令时刻——是的,两个指令是顺序发送的,中间是有时间间隔的,虽然这时间间隔大部分时候几乎可以被忽略不计。可以看到,很霉运地,系统还没有收到我们发送的pfm,玩家和wat武士开战后的第一个搏动点就来临了,这时NPC就会先于玩家出招。如果再霉些,出的是pfm……咳咳。我们当然希望避免这种情况的发生。如何避免呢?要尽量地把#标识的位置放在一个心跳周期的前半部分,比如图5中的“^”时刻,这样就预留了足够的时间给网络传输,让服务器在搏动点到来之前达到*时刻。可玩家怎么知道当前处于心跳周期中的前半部分还是后半部分呢?可以根据之前介绍的心跳的特性,用dazuo来测试:当出现“你运功完毕,深深吸了口气,站了起来”提示时,一定是一个搏动点刚过去,下一个心跳周期刚开始的时刻。所以我们可以在每一层的战斗结束之后,先不急着上楼,来个dazuo 10,然后做好触发,在起身的瞬间up;alias,可能、应该、大概可以保证先手(欢迎验证这一推论的真实性)。
之所以举wat的例子,是因为这个任务的环境比较简单,不受外界因素影响。其实胡一刀、萧峰等其他的战斗原理是相同的。
因为心跳在MUD中无处不在,所以留心它会给我们带来很多启发。再举个小例子吧,我们知道北侠有每秒限制指令数的规则,但是有时候明明我们用计时器,每秒发送20个指令,为什么却还是经常出现“> > > > >”而导致部分指令被系统吃掉?还是像打坐的例子里图4所示,因为网络问题,发生了交通拥堵,大量指令不巧堆到同一个心跳区间去了……所以有能力的同学,可以在每一串指令后面加一个dazuo 10,等到系统反馈(即进入下一个心跳区间)之后再继续发送下一串指令,可保万无一失。
其实心跳的技巧还有很多,这里不过抛砖引玉,更多技巧还有待智慧的玩家去发掘。
===========END===========
占楼备用 以后会不会满大街都在dazuo{:7_279:} ……北侠可以开研究院了 收藏已备好好学习 顺便了解北侠心跳间隔为多长时间? 回复 7# pos
1000毫秒 本帖最后由 hijacker 于 2013-7-31 10:54 AM 编辑
回复 4# alucar
zmud我不太清楚,不过mush是可以这样玩的:把城际互联里的set no_more walkgo换成dazuo 10,把设定环境变量:no_more = "walkgo"换成打坐完毕那句提示。。当然只是理论上可行,因为这个实在是比较容易受到干扰。还是那句话,抛砖引玉,呵呵 回复 5# zgbl
我这个充其量只能算是观察结果+一点总结吧。。比起爱玩数字的某硬盘差远了。。。{:7_278:}