很多新人们做图时遇到玩家掉线情况,而没有一个具体的说明. 实在是原因多种多样,不过我把常见的一些说明一下. 有错误或者不完全的地方希望大家补充说明. 我先简单说下魔兽的数据验证方式——封包验证,也可以说所有的联网游戏都是这么验证的.每个玩家在游戏中的任意操作都会使用封包传递验证,并且是相互验证,只有在其他机器返回验证成功的封包,游戏数据才会真正发生改变.这也就是数据同步. 现在我们再来看看掉线. 我把掉线称为天灾人祸. 天灾是不可抗拒因素,也就是网络连接问题. 人祸是制图时作者的一些失误造成的. 天灾 天灾来的比较缓慢,因为网络传输具有不稳定性,所以在网络堵塞或者断开网络的时候,出现的是等待XX秒.这就是上面所说的验证机制,机器运行魔兽时不会单方面做出判断,必须相互验证成功后才会做出判断.所以在等待的XX秒钟,机器一直在等待返回验证的封包.当然不是一直等待,在XX秒后点击"丢失玩家"就可以继续游戏了.为什么要点击"丢失玩家"呢?这是因为超时无法得到返回验证后,要确认丢失玩家,必须保持数据同步.在点下"丢失玩家"以后,就发送封包去验证,在所有玩家都点了后,数据同步了,才会继续游戏.就这么个道理! 人祸 人祸是我们重点要看得东西.一般来说分为两种情况下 1.数据不同步 情况:使用 本地玩家 问题:返回值不同,导致掉线 解决:不用 本地玩家 这个函数;其他; 解释:对于本地玩家,我们可以把它看成任意单位的所有者的计算机. 由于只是指代单一机器,所以无法使用 本地玩家 作出需要返回验证的操作. 因此常见的使用场合 就只有多面板之类的,并不实际存在数据的方面. 情况:使用 wait ; 问题:时间误差太大,导致掉线 解决:尽量少使用wait;使用时尽量写整数秒数; 解释:wait分为等待游戏时间和等待现实时间两种.而wait函数本身的精度本来就不高,等待游戏时间的精度比等待现实时间更低.精度低意味着误差大,误差大过一定范围就会因为数据不同步造成掉线.而且,这个误差是随机的. 情况:wait与timer混用 问题:时间误差大,导致掉线 解决:尽量不要出现wait与timer混用的情况; 解释:timer的精度远比wait高很多,所以在低精度要求下使用wait,高精度使用timer. 情况:循环中使用wait 问题:不定时掉线 解决:不要再循环中使用wait 解释:虽然误差是个随机值,不过在循环中使用,发生掉线的概率显著提升. 情况:骰子个数和面数过大 问题:不定时掉线 解决:把筛子个数和面数设定小些 解释:涉及到随机数设定,很复杂.简单点说,我们设定的只是概率,具体的随机数算法我们无法修改.所以骰子个数与面数过大,运算出现的误差就越大,掉线几率就越高. 情况:触发中设置随机数过大 问题:极小情况下掉线 解决:随机数设定小些 解释:基本上这种掉线情况是不会出现的,之所以列出来,是要与上面的骰子问题做个说明.骰子和随机数是相同的算法,唯一的区别就在于运算队列. 一个程序的运行效率是确定的,魔兽也如此.我们可以把骰子看成支线剧情,把T或J中做的随机数看成主线剧情.主线剧情是必须的,所以占用的资源多,运算精确;支线任务与主线并行,但是相对的占用资源少,运算误差就大了.不过具体使用随机数会造成掉线的程度我没研究过,只是理论上存在. 情况:条件代替动作(JASS) 问题:精确情况下掉线 解决:做适当的修改 解释:本人J白,无法解释. 情况:guo发的JASS培训班教程中的RPBUG 问题:精确情况下掉线 解决:请看《JASS培训班教程》 解释:在上面的教程中已经有了解释,我有一些自己的看法. 在函数传递时需要得到返回值的问题.我们会发现暴雪官方地图使用的J中有许多我们认为累赘的语句,是失误?还是故意?很明显,存在即有意义.每个函数需要的返回值不同,具体的函数我们又很难全部记住,那么,最简单的办法就是全部给予返回值. 2.魔兽数据 WE中我们可以使用外部资源导入到地图中使用,而有些时候,问题就在这里. 情况:导入 说明: 1.WE的导入编辑器只检查文件的后缀名.这意味着,我们可以把任意格式文件的后缀名改为WAR3能使用的文件格式就可以导入. 2.我们使用格式转换工具的时候,也有可能在转换过程中文件损坏,造成无法识别. 3.我们导入后的模型在WE编辑器中能显示了,不代表模型就没问题. 解决:新建个地图,把图标图片模型先导入进去测试一下,没有问题了再使用. 假如有问题,自己进行修改或者更换. |