http://blog.codingnow.com/2007/11/inertia_thinking.html

晚上在办公室晃荡,对面的同事在加班写代码。我凑上去看看在写什么。我向他了解了后明白了,大约是服务器上角色 buff 的实现吧。

BUFF 这个术语是现在网络游戏中非常常见的。给角色加一个 BUFF 通常意味着对虚拟角色的一些数值上的临时修正:例如,攻击力 +5 ,防御 -10% ,速度加倍,等等。

玩过魔兽世界的朋友应该很容易理解这些。通常游戏里的 BUFF 设定比我上述的例子更加的复杂。

这里不谈游戏设定,谈谈实现。

同事在做的实现框架,给 BUFF 留了几个接口,其中有两个吸引了我的目光。

一个叫做 start 一个 stop 。分别用于 BUFF 产生的时候需要处理的逻辑,和一个用于 BUFF 消失时处理的逻辑。这是一个很自然的设计。尤其在 C++ 程序编写的习惯里,就相当于一个构造过程,一个析构过程。

比如,一个攻击 +5 的 BUFF ,可以在 start 事件处理里修正攻击值(+5),然后在 stop 里做一次逆运算(-5)。

我突然有一种直觉,感觉这个设计不是特别合理。因为它要求程序员去实现一对互逆的逻辑。这段时间我对需要编写事物处理的成对可逆处理的设计特别反感。所以立刻就意识到了实际问题所在。

首先,许多逻辑上成立的可逆运算都是事实上有漏洞的。比如某些特定条件下的浮点加减运算就有可能不可逆(暂时没有去构造一个例子,但是我认为是可以构造出来的);定点数的乘除运算就很容易导致不可逆。

还有更严重的,如果一个 BUFF 会把某个值设置成固定值(比如清 0 或设为 max),那么不借助缓存变量,这个效果就完全不可逆。

当然有经验的数值策划,会把公式里的乘法规则提取出来,安排合理的次序去计算。比如大多数游戏中,乘法加成系数都是先累加再一次乘起来的。(btw, 早期刚接触 diablo 的时候,我完全不能理解:为啥两个加 20% 的装备装到一起是 40% 的效果而不是 44% :D 也有游戏设计的更复杂一些,例如 Eve 里,就有所谓的叠加惩罚。哦,好象又写跑题了。)

我问了一下同事,诸如一些特殊情况如何处理的问题:比如玩家顶着 BUFF 断线,重新上线的数值恢复问题。还有如果在 BUFF 有效期间,人物升级或更换装备导致基本数值变更,怎么保证 BUFF 消失时的逆运算正确性……

这些自然可以找到方法在现在的框架下正确的处理。但前提是实现的人考虑完备,或是多记录一些中间数据。当两件有关联的操作(BUFF 出现和消失)在不同的代码中实现时,BUG 就有可能滋生。

接下来我又询问了一下别的项目的同事,咨询了一下类似的设计他们是如何实现的。居然,大家都用的相同的手段。看来,思维还真是有惯性啊。


我后来想到的解决方案其实很简单。取消 start / stop 接口,改提供一个 apply 。角色永远记录两套数值,一套基础数值,一套产生实际效果的临时数值。

每次状态改变(增加新的 BUFF、改变基础数值,或是改变装备等),都激发所有存在的 BUFF 的 apply 方法在基础数值上全部重新计算一遍,得到新的临时数值。这样有可能会增加一些计算量,但是系统设计会更简洁一点。

思维的惯性之游戏中buf管理相关推荐

  1. 测试中如何管理外包质量_【项目管理】资深游戏测试总监详解质量管理工作的9个步骤...

    看了这张图,你看官方有没有打消游戏测试就是拿工资玩游戏的观点,呵呵. 一款游戏的质量保证工作,基本都是围绕上图中的具体工作展开的.为了保证测试任务的效率和质量,项目团队中的测试人员承担所有上述工作是不 ...

  2. 游戏开发入门(八)游戏中的场景管理

    视频链接:游戏开发入门(八)游戏中的场景管理(5节课 时常:约2小时07分钟) 授课者通过2D围棋的例子,逐步拓展成3D的虚拟游戏世界.这个3D游戏世界基本上就可以涵盖市面上所有类型的游戏了,我们通过 ...

  3. 论游戏中Buff的实现

    源地址:http://blog.codingnow.com/2007/11/inertia_thinking.html 晚上在办公室晃荡,对面的同事在加班写代码.我凑上去看看在写什么.我向他了解了后明 ...

  4. 游戏中BUFF的实现

    晚上在办公室晃荡,对面的同事在加班写代码.我凑上去看看在写什么.我向他了解了后明白了,大约是服务器上角色 buff 的实现吧. BUFF 这个术语是现在网络游戏中非常常见的.给角色加一个 BUFF 通 ...

  5. 多人联机游戏中联网模块(Socket)的设计和各种问题解决

    这是我自己做的一个多人联机游戏中网络部分的总结.全部为自己全新做的,没用开源软件(有一个网络游戏开源软件Raknet).目的是写一个属于自己的可靠网络模块,修改.扩展后在很多地方都能用得着.也想自己从 ...

  6. 关于游戏中仓库类的设计

    前言 这个游戏中的仓库类设计开始于春节前,和大家一样,我也是期盼着放假而无心工作,所以在放假前一天虽然蹦出了思维的火花,我却没有使用文字记录下来,但是大致的思路我已经记录到脑子中了,这一次的突然感悟, ...

  7. 在游戏中测试复杂的系统

    I've been testing software for a long time. In fact, my first job was as a tester. In an industry wh ...

  8. CreatorPrimer | 物理小游戏(物理引擎管理器)

    前面两篇我们介绍了物理投篮小游戏的界面布局.物理组件的基本使用方法,从今天开始进入编程篇的内容.难度在逐渐加深,为了不给大家造成阅读负担,程序篇会分成多次来讲,每篇教程尽量简单,就算没有编程基础,跟着 ...

  9. 使用Wwise在3D RPG游戏中的声音设计思路

    使用Wwise在3D RPG游戏中的声音设计思路 https://blog.audiokinetic.com/zh/how-to-use-wwise-in-3d-rpg-game/ 大家好,随着Wwi ...

最新文章

  1. Java中BASE64 编码
  2. 谷歌CEO为「Jeff Dean开除研究员」事件道歉,却引发持续争议
  3. java判断时间是不是星期五_Java判断当前日期是星期几
  4. vbs禁用任务管理器
  5. 突然吐字不清_要注意说话吐字不清小心是脑中风前兆
  6. 水面反光如何拍摄_拍摄水面反射的创意
  7. 限制对web路径的访问
  8. 如何查看当前音频的输出路径
  9. 华为NP课程笔记14-PIM-SM和SPT切换
  10. [高通SDM450][Android9.0]PL2303G驱动升级
  11. 用css做一个梦幻西游动画特效
  12. 信数金服:物联网案例之工业物联网中故障预警与风险管理的规范性分析
  13. 输入学生成绩评定等级:90-100为A,80-89为B,60-79为C,小于60为D
  14. 乐视电视连无线服务器异常,乐视电视怎么连网 有线连接or无线连接任选
  15. JSON.parse和JSON.stringify
  16. 机器学习专题之概率论——雅可比式
  17. 牛客_美团点评2020校招前端笔试题(仅个人学习记录)
  18. pandas入门(6)——数据加载、存储与文件格式
  19. subprocess.Popen()
  20. ChatGPT教程之 02 ChatGPT 正在经历托马斯爱迪生的时刻,为什么需要获得突破性技术

热门文章

  1. 875计算机大纲,上海大学875多媒体技术2018研究生入学考试大纲
  2. 当刚毕业工作半年遇上裁员
  3. Photoshop 2019 画特定尺寸的矩形
  4. NVIDIA设备弹出错误,这个设备是不可移动的,问题的解决办法
  5. Lighthousenbsp;Partners赞助的区…
  6. 《高分子合成工艺》简答题答案
  7. BUUCTF-刷题记录-10
  8. 潘凯:C++对象布局及多态实现的探索(五)
  9. 新零售时代的新营销,OTT何故成为香饽饽?
  10. [东师培训D5T2] 公主的朋友