找回密码
 点一下
查看: 1619|回复: 4

关于效率问题,现在修正后。

[复制链接]
发表于 2016-12-20 03:23:48 | 显示全部楼层 |阅读模式
本帖最后由 东方油瓶 于 2016-12-20 03:46 编辑

以前写的太混乱,属于验证探索期。

现在逐渐接近已知的状态,分享一些结果。


---------------------------------------首先是关于行为层数的效率问题:
属性类型的行为叠加,与增益行的行为叠加,本质上不是一种东西,是两种完全不同的行为。

属性类型虽然也可以用行为叠加层数获取,但是却有几个特性:
1. 可以是负数,很酷炫。
2. 其部分属性也可以基础负数设定,比如+10%攻击速度,如果-1层时,会减少 10% 的攻击速度。

他与增益类效果的区别:

增益类的效果会创建实例,根据行为的层数,这个其实很好理解:
第1点:伤害响应来分析
如果你是10层,那么响应10次,如果是1000层,响应1000次。
第2点:持续时间来分析
如果不勾选"刷新叠加"标旗,行为的持续时间会独立计算,1000层在不同时间获得,计算的时间也是独立的。

从脚本的角度去分析,一个行为增益具有这种功能,肯定是要创建不同的线程才能够完成的。
至少,至少也要有专门的独立线程来处理 获得与失去时,不同层数的时间问题,或者叠加的响应次数问题。

因此增益类的行为叠加数量,是会明显影响效率的。
这个层数大概在上了 5000+ 左右开始体现,但是实际游戏中并不能支持 5000+之前不卡顿。
因为测试时,这5000+的叠加仅仅在行为只是一个空壳并且只有叠加次数时,添加下一个会出现明显卡顿的情况。
那么在有实际效果时,这一阈值肯定也会受到影响,也就是更小的时候就会被影响。

i7处理器+960显卡,这种电脑算得上是中等偏上了,因此不会是设备的问题。

但是测试属性类型的效果时。

10个属性,我给他每个 1亿 的叠加层数,没有丝毫波动,陆战队员甚至有点想笑。
我再给了100亿,还是没有丝毫波动。

同时属性是没有响应伤害的功能的,也就是可以理解,属性真的就是字面意思,仅仅是改变一个单位的属性,并不考虑持续时间这样需要独立线程完成的东西。
因此属性无论多少层都没有影响。

原来产生了真正影响的并不是属性,而是用于属性叠加的增益,因为属性的层数是没有办法通过触发器修改的。
因此要避免,用100个增益层数,每个增益+1属性去完成属性的修改,而是1个增益+100属性。
功能方面的问题需要自己用脚本去解决,比如数据模板,或者2进制属性、10进制属性等。
这也就是属性局限性的地方,希望暴雪能够添加新的函数吧,然而希望很渺茫。

一个趣味性的bug表示,暴雪是完全可以增加一个这样的函数的:
物品BUG,当物品的行为带来超过属性行为上限的增益时,失去这一物品,将会改变单位的属性为非正常状态。

---------------------------------------另外最近发现一个行为的新玩法:
关于UI编辑器创建的支持显示层数以及持续时间冷却状态的 behaviorPanel。会响应如下机制:

1.如果行为标旗去掉倒计时,那么冷却转的方向也会逆方向转动,很搞笑。
2.行为叠加的层数,不仅仅可以显示BUG叠加层数,如果勾选了行为伤害响应中的 费用-充能计数。
那么充能计数也会覆盖掉行为的当前叠加层数,显示为该行为当前的计数。
很TM实用,我很多用于计算类的,叠加类的效果都这样弄了。
如果用于这一功能,需要去掉“疲劳伤害响应”,否则行为将会在0 充能计数时消失。
反过来,这也可以用于一些自动消失的计数类效果,真的很实用。

---------------------------------------最后关于爱恨情仇的数据模板:

这个东西真的,只能靠猜了。
猜测是,多个玩家不同数据的同一个字段,如果不同步默认的玩家越多,那么在使用这一效果时,就会占用越多的效率?
想一下,比如哈。
在星际2的脚本中,玩家数量16.那么每个字段都是 amount[17] 这个尺寸的变量。实数或者字符串或者整数。
当检测到已被修改的字段时,将使用amount[player]的值,否则使用amount[0]
如果是这样的话,就很好理解了。

基于这个,我现在的使用方式:改变-制造-修改为默认。
这样玩家的数据除了使用一瞬间全都是同步的。

当然这完全是自己的猜测,没有任何的根据,也没有任何的分析,仅仅凭的感觉,参考性并不好。

另外,数据模板的一些效果,是可以实时改变的。

比如,行为的修改限制,配合自定义的生命护盾条,可以显示为护盾。
此时,真实的修改限制是实时的,也就是在创建的那一瞬间,施法者的数据模板数值。
之后的没有影响,因为修改限制是,某个单位的 某个行为的 独立修改剩余值。
因此可以实时改变修改实际效果,伤害量也是同理,不会出现已经创建的被之后修改影响的情况。

属性类的效果就受到之后修改的影响。

具体的玩家为,施法者玩家。
这也是无论行为、效果,在触发器中的函数,都有目标玩家、施法者玩家,或目标单位、施法者单位的原因。

行为的数据模板,取决于行为的施法者,行为的施法者,取决于脚本创建时的制定者,或者,创建行为效果的施法者。
很容易去理解。


基于这个,大部分支持多玩家多单位的效果,实际上还是TM要用WAR3的那一套,要么自己写一个新系统,要么做2进制属性这种蹩脚的东西同步原来的系统。
暴雪始终没有开发所有接口,而这些不开放的部分,导致了开放的部分实际上也显得很蹩脚了。

但是,只支持多玩家的效果,是可以通过数据模板来完成的了,这也是进步比较大的一个地方。
默默庆幸一下,幸亏我做的是单英雄图,不用考虑这些幺蛾子,养成类RPG或者多人对战RPG或者TD同志们,我在这里致以最崇高的敬意与深深的同情。


---------------------------------------额,最后的最后,关于数据模板与行为的联动:

1.假如,一个增益可以修改某个属性的 点数,那么通过数据模板来修改这一个点数时。
触发器依然会响应单位属性改变巴拉巴拉巴之类的效果,也就是说实际上是一次所有数据的修改。
不用考虑相关的同步问题,这一点还是点赞的,做的不错爸爸。

2.关于触发器的行为类数据捕获

(1. 单位有行为
在虚空之遗后,暴雪爸爸非常鸡贼,非常猥琐的,更换了一个函数 :UnitHasBehavior2
而原来没有2,那个原来的UnitHasBehavior仍然保持在native之中,但是GUI写的已经被替换了。
这两个函数的区别是:原来的,加入单位的行为被禁用了,依然返回true
2版本,如果被禁用,那么返回false
单位的行为存在有、没有;有但被禁用、有而且启用这种不同的状况。

(2. 单位行为叠加层数。
如果行为被禁用,触发器依然获得正常的叠加数,但,数据编辑器验证器中获得的是0

(3. 单位行为X 与 单位身上的行为数量
超极坑爹的一个玩意儿。
首先,获取的数量,存在跟数组一样的问题,实际上是17个他会返回16。

最最最坑的来了:
获取单位的行为X

这个居然是从 1 开始的,我TM也是醉了。
你获取数量从 0开始,获取指定的从1开始,用起来不死人见了鬼简直是。

目前这两个函数我已经封装了自己的,实际上大部分函数我都自己封装了。
大概过程就是:用的时候感觉这个不顺手啊,封装一下下。那个不顺手啊,封装一下下。
回头一看,娘的全是自己封装过的了。


3. 关于属性的一些不要碰的地方
前面说过,负数属性跟正数一样可以作用某些单位属性。但是活力类的最好别碰,无论是恢复速度还是最大值。
负数会直接爆炸,单位的血量会不停的跳或者死掉,很尴尬。


啊啊啊啊啊啊啊啊啊就这么多吧,作图去了。
总之,星际2,需要一些好图......否则,这次是认真的:离死不远了。


 楼主| 发表于 2016-12-20 03:39:59 | 显示全部楼层
回复

使用道具 举报

发表于 2016-12-22 21:38:59 | 显示全部楼层
数据模板的值是即用即写的,只要有可以更改的值被调用就为每个玩家写一个值保存在内存中,只有暴雪认为不适合更改的值不会为每个玩家创建一次。 毕竟用0~16地址就比0~15多出一位。

点评

多谢指教。  详情 回复 发表于 2016-12-22 23:34
回复

使用道具 举报

 楼主| 发表于 2016-12-22 23:34:52 | 显示全部楼层
priceles 发表于 2016-12-22 21:38
数据模板的值是即用即写的,只要有可以更改的值被调用就为每个玩家写一个值保存在内存中,只有暴雪认为不适 ...

多谢指教。
回复

使用道具 举报

发表于 2016-12-23 00:44:29 | 显示全部楼层
效率什么的,我现在都在数据里面用修改玩家的效果来设置一些比较固定比较死的“属性”加成。然后触发器里面只有在单位升级和单位学习技能的时候再用触发器数据模板来修改。事实证明数据编辑器的修改玩家效果是在触发器之前设置的,而且效率相对也高很多。所以现在我的触发器数据模板已经大幅度精简了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 02:41 , Processed in 0.280350 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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