找回密码
 点一下
查看: 1119|回复: 9

请教 枚举类数据效率 以及 乘法属性叠加 的问题

[复制链接]
发表于 2016-9-14 15:31:34 | 显示全部楼层 |阅读模式


提问1:枚举类数据效率

举个栗子,我需要一些效果在单位升级时提升数据效果。
做法1是使用数据编辑器的switch,根据单位类型 升级不同的属性(效果-修改玩家-效果)

做法2是使用触发编辑器,在升级时,依然使用的修改玩家进行数据模板修改,每个效果的ID比如   levelUp_zealot
这样的话触发器就不用一条条的枚举 if then(1) if then(2) if then(3)....这个样子了,可以用 "levelUp_" + UnitGetType 来获取升级效果

那么,遇到这种情况,触发器的效率更高一点,还是数据编辑器的效果更好呢? 基础的单位类型数量就设为60个,来做研究

能力有限,无法判断,这种类型的问题也无法简单的测试出来效率的差距,希望高手指教....

提问2:乘法属性叠加

最近星际2增加了一个很好很好的行为修改单位属性的调整。
累加类的提升效果,比如累加攻击速度因子 与 累加移动速度因子

在没有这两个数据,2年前的时候,我用老版的"攻击速度倍数"做是做出了很多的问题的。

比如,在单位没有攻速上限限制的情况下, 给这个单位配备3个不同的攻速buff,每个分别是50%的提升,假设单位基础攻击间隔为2.0

老版乘法型:2 /1.5/1.5/1.5 ≈ 0.59
新版累加型:2/ (1 + 0.5 + 0.5 +0.5) = 0.8

这个差距可大了,而且这只是3个攻速buff的情况下,假如有更多的,那么乘法型的属性显然会爆炸,不符合实际需求。

现在,攻速移速以及生命回复速度 以及 属性百分比最大值,都有了这种累加型的 支持数据,可是有一些依然没有:时间流逝速度、倍率数数组(可用于冷却缩减)
我在想,做个图总不能太依赖老东家的更新吧?所以想自己解决一下

在不过分使用触发器"模拟"累加型叠加数据的情况下,有没有什么通过数学去解决的办法?

例如冷却加速,如果上限是提升40%(按照倍率来算应该≈ 1.6666...7倍,可以勉强算为1.67倍)

做一个属性,每级提升至原来的1.01倍, 1.01^50 ≈ 1.645, 这个属性最大点数设置为50点,可以没有太多差别的 到达同样的效果。

可是这仅限于数据上限很小的情况,数据上限一旦大起来又尴尬了,降低 底数 会导致点数低的时候收益太低,而指数太高(数据上限)又会使得收益越来越翻倍。实在是纠结啊~

发表于 2016-9-14 16:58:38 | 显示全部楼层
1、将单位类型作为key将对应的效果存入DataTable,升级时获取即可,无需遍历,效率最高
2、由于SE的实数精度只有1/4096,所以触发处理精度会有问题。非要按以前的方式进行乘法计算么
回复

使用道具 举报

发表于 2016-9-14 16:58:39 | 显示全部楼层
1、将单位类型作为key将对应的效果存入DataTable,升级时获取即可,无需遍历,效率最高
2、由于SE的实数精度只有1/4096,所以触发处理精度会有问题。非要按以前的方式进行乘法计算么

点评

首先,谢谢孔明兄热情的回答。 不过我想我的问题不够明确。 1. 我想问的是, 数据编辑器的遍历 与 触发器的datatable 或者 字符串法 哪个更加高效? 从直接效率来说,数据编辑器更高 但是从实际案例来说,  详情 回复 发表于 2016-9-14 17:08
回复

使用道具 举报

 楼主| 发表于 2016-9-14 17:08:45 | 显示全部楼层
疯人¢衰人 发表于 2016-9-14 16:58
1、将单位类型作为key将对应的效果存入DataTable,升级时获取即可,无需遍历,效率最高
2、由于SE的实数精 ...

首先,谢谢孔明兄热情的回答。
不过我想我的问题不够明确。

1.  我想问的是, 数据编辑器的遍历  与   触发器的datatable 或者  字符串法 哪个更加高效?
从直接效率来说,数据编辑器更高
但是从实际案例来说,触发器更高。因为数据编辑器的switch 是一定要遍历的吧?
我的问题是,遍历的数据编辑器 与 无需遍历的触发器 比起来,哪个效率更好。

2. 想获得一个解决方案,或者是思路也行。
就是 如何用原本的 乘法计算 做出 累加式计算。
例如"时间流逝倍数"现在还是乘法计算的,如果要做出一个累加型的时间流逝属性,如何处理比较好呢?

点评

魔兽3也就零几年出来的吧,我开始玩编辑器应该是02-03年前后,具体记不准了。到现在不是十几年了吗....  发表于 2016-9-16 20:21
高手不敢当,接触游戏设计方面的知识早一点而已。当然,我也没有专门学过游戏策划和编程什么的,不过从魔兽3刚出来就玩编辑器,到现在十几年了,多少积累了一点东西。  详情 回复 发表于 2016-9-16 00:48
回复

使用道具 举报

发表于 2016-9-15 18:24:46 | 显示全部楼层
1.个人是认为使用不遍历的话会好。但是就你所说的这种情况,效率问题体现不出来,因为这对于电脑程序来说就是瞬间的瞬间的瞬间。如果你每秒钟执行个几千遍的升级或许有些差别。
2.不要直接使用指数函数,而是采用其他更为合理的函数,让曲线开始的斜率很大,但是随着x变量的增高而斜率越来越小,甚至让函数自己带有极限。比如,让一条抛物线躺下,取其第一区间的一支。这样做出来的函数就会出现在初始的时候属性收益很大,但是随着属性的堆砌,收益会越来越小,玩家需要衡量自己的付出是否得到足够的回报(因为获取一点属性的付出相差不多,甚至会越来越多,但是收益会越来越小),从而增加可玩性,也让作者能更容易的平衡数据。另外,使用函数的另一好处是:不必考虑精确度的问题,因为合理的设计可以避免重复计算,精确度损失不会积累。

点评

兄台的回答,收益颇深,尤其是对于函数方面,看来兄台是这方面的高手啊... 多谢!  发表于 2016-9-15 23:01
回复

使用道具 举报

发表于 2016-9-16 00:48:57 | 显示全部楼层
东方油瓶 发表于 2016-9-14 17:08
首先,谢谢孔明兄热情的回答。
不过我想我的问题不够明确。

高手不敢当,接触游戏设计方面的知识早一点而已。当然,我也没有专门学过游戏策划和编程什么的,不过从魔兽3刚出来就玩编辑器,到现在十几年了,多少积累了一点东西。

点评

十几年啊.......  发表于 2016-9-16 13:17
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-23 03:29 , Processed in 0.393701 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表