游戏走上正轨了,不需要没日没夜的垒代码,今天很闲啊,顺便总结一下对玩家属性更新这个流程的想法吧。
属性更新就是当玩家的属性发生变化时,重新计算各项属性的值并更新到客户端,因为属性变化实在是太频繁了,技能、装备、buff、使用道具.....,所以计算属性值的目标是:
1尽量简单,虽然现在这个计算操作对cpu来说已经是小菜一碟,但是还是尽量不要造成cpu的额外负担
2 更新到客户端时,尽量使数据最小化,不要更新一个属性就发送一堆数据到客户端,特别是当这个属性不只是要更新给玩家自己,同时还要更新给附近的所有玩家时,那样你会发现你的流量成倍的在增大。
先说说属性的计算吧。我把玩家的属性分为一级属性和二级属性,一级属性就是策划定义的最直接的数值,比如玩家的基本属性点(武力、体质、精神等等)、buff增加的属性值、技能增加的属性值。二级属性是根据一级属性计算出来的属性值,如攻击力、防御力、移动速度、血量等等。属性的计算就是一个根据一级属性计算二级属性的过程,当然有的游戏可能还有三级属性,如果策划很NB,能管理过来这么多数值的话。某个一级属性的值改变了,会导致一个或者几个二级属性的值需要重新计算。
我想到了这样几个办法:
1 一级属性产生效果时给二级属性增加变化值,一级属性效果结束给二级属性减去对应的数值。这个办法最直观,但是不太可行,因为属性计算并不只有增加减少这么简单,可能增加的是某个范围内的随机值,技能结束时减去时的数值可能不等于技能开始时数值;还有一级属性的各个数值计算也有优先级,不是简单的加减就能满足的。再想想其他办法吧。
2 一级属性发生变化时重新计算所有二级属性的值,当前有很多游戏就是这样做的。这样做的好处是既能满足策划的需要,对程序来说逻辑也很简单,但是计算量明显比办法1要大,当然我们也可以优化,比如把属性分为玩家的、宠物的、坐骑的几个部分,玩家的一级属性变化了,就更新玩家的二级属性;宠物的一级属性变化了,就更新宠物的二级属性,程序猿们自然有各种优化的办法。
3 第三种方式,对于策划定义的每个一级属性a,在程序中都对应一个程序中的一级属性值_a,这个值记录了该一级属性变化的具体数值,技能开始时设置数值a,结束时把a的值清除,这样解决了技能结束时减少的数值和开始时增加的数值可能不匹配的问题。同时,还需要记录这个一级属性值_a影响了哪几个二级属性,为他们的关系建立映射,当_a改变时,只需要重新计算它影响到的二级属性,而不是所有的二级属性,从而达到减少计算量的目的。
第三种方式当然要复杂一些,但是程序猿嘛,呵呵,不就是解决问题的吗。。。
再来说说属性的更新吧。
这个和消息的定义有关系,如果消息是以块的方式来定义的,一个消息块包含了一组数值,比如玩家自身的属性消息、玩家宠物的属性消息、玩家坐骑的属性消息,某个属性更新时,就更新对应的消息块,这样比较适用上面属性计算的第二种方式。
另外一个办法就是用可变长的消息,只更新发生变化的属性值。具体做法是,用一个标识符给所有的属性做标记,每个属性在标识符中占有一个标记位,当属性发生变化时,就把对应的标记位置1,给玩家发属性消息时,只发标记位被置1的数据,当然,发送完以后要把对应的标记为清0。
第一种方法简单,但是数据量大;第二种方法数据量小,可是每加一个属性,都要增加相应的标记位,客户端接收数据以后还要按相应的标记位解析,逻辑要复杂一些。
终于整理完了,实际应用中肯定还有其它各样的解决办法,希望以后能找到更好的。