东方油瓶 发表于 2017-9-17 16:50:15

关于伤害、行为、效果等事件注册

本帖最后由 东方油瓶 于 2017-9-17 16:51 编辑

一个新的发现,极大的利于,注册某些特殊"类"的效果。

源于数据模板的函数:
int CatalogEntryCount(c_gameCatalogEffect);
读取某个数据模板类型下的条目计数,如所有效果(CEffect)、所有的技能(CAbil)、所有的单位(CUnit)等

string CatalogEntryGet(c_gameCatalogEffect, lv_i);

获取某个数据模板类型下的某个条目。

我们经常需要捕获某些特定的行为、效果、技能的事件,原来日常的是,

-任意效果触发
-如果效果满足条件X
-动作


后来高明了一些


-指定效果触发
-动作




但是用这两个函数配合 指定效果事件、指定行为事件的注册。
可以在游戏开始时根据需要注册特定类别的条目事件。


例如,"应用了攻击速度增益的行为事件"
可以在开局时,通过数据模板值筛选 累加攻击速度加成≠0、攻击速度倍数≠1的行为,注册在特定触发器,这样可以节约条件的判断过程。
缺陷就是,如果数据模板在游戏进行时被改动,那么自然就不准确了,不过一般来说,一个攻击速度增益的行为,始终都应该有一定的攻击速度增益。


但是由此,虚空之遗后的 特定类型行为事件 等等,实际上可以用这种方法来完成了。
例如,可以根据条目的特定ID来筛选,比如这样:


priceles 发表于 2017-9-17 17:31:41

并没有节约运算量,只是星际2帮你判断了

东方油瓶 发表于 2017-9-17 19:52:49

priceles 发表于 2017-9-17 17:31
并没有节约运算量,只是星际2帮你判断了

我是指任意效果触发跟开局注册特定类型效果之间的运行差。

你能看歪成这个样子我也是真的服气。
你是故意找我茬的吗老哥?

东方油瓶 发表于 2017-9-17 20:02:41

priceles 发表于 2017-9-17 17:31
并没有节约运算量,只是星际2帮你判断了

我写清楚我这些字所表达的意义:

1. 现在可以用另一种方法捕获 "任意类效果触发" 的事件
≠ 另一种方法节约了运算量

2. 相较于 "任意效果触发时" 做条件判断,开局通过这种办法筛选出特定"类" 效果的触发肯定比每次触发都要判断要好。

3. 在以前,YDWE的"任意单位受到伤害" 事件,就是在WE的"指定单位受到伤害" 事件的原理上,为每个进入地图的单位注册事件而完成的,与这个方法异曲同工。
区别是,现在可以完成更大范围的任意事件了,任意行为、任意效果。
要知道,任意事件是误触发率非常高的,每次都进行判断是不明智的。

4. 关于优化的方面任何的可优化的都可以说是必要的。
不然星际2为什么这么卡?不要跟我说一个变量几个变量占多少多少内存。

某些地图卡成什么样子各位心里真的没点数吗?
事实如此明显,问题如此严峻,居然还能找我的茬。

如果是我在哪里不小心得罪了老哥,我也只能说,在下,服了。

priceles 发表于 2017-9-17 22:03:02

东方油瓶 发表于 2017-9-17 20:02
我写清楚我这些字所表达的意义:

1. 现在可以用另一种方法捕获 "任意类效果触发" 的事件


我开着节能模式测试这个地图,两种方法都是40秒才响应,从时间上看确实没有任何区别。你也可以自己试试看(拿表观察,观察星际2左下角时间变化)

sd2190990 发表于 2017-9-19 05:00:23

RTS游戏是实时的,你要把所有会卡的部分延后执行,那RTS的意义何在=,=

东方油瓶 发表于 2017-9-21 23:47:04

priceles 发表于 2017-9-17 22:03
我开着节能模式测试这个地图,两种方法都是40秒才响应,从时间上看确实没有任何区别。你也可以自己试试看 ...

触发看了,么有进去试。

但是这只是一个很少的判断,因为只有一个字符串比较。
如果是 单位拥有行为、数据模板值之类的比较,比只获取一个字符串要多。
如果是多行多条件判断,那么会更多。

更重要的是,若不是原生函数,是自定义的函数,比较复杂的函数呢?
最重要的是,无论多或者少,这个条件判断是一个完全可以规避的地方,不以恶小而不为。

当然,我仅保持的一个个人观点。

若我成了或者不成,那么再回过头来看这件事,共勉。
总之,我要做一张不会卡的图,完全流畅。

yxxiaobin 发表于 2017-9-22 04:11:13

我觉得楼主的方案有一个优势在于:可以不用写很多条件,减少误触发的可能性,在某些情况下应该是很有用的。
不过在执行效率上应该没什么区别。因为本身其实也是需要比对的,只是这个封装了,用户就不必一条一条去写代码了。
另外如楼主所说,这里有一个比较致命的缺陷:升级可能会改变数据模板的值,从而导致不能触发,或者错误触发。这个问题极大的制约了这种做法的推广。

priceles 发表于 2017-9-22 23:26:37

东方油瓶 发表于 2017-9-21 23:47
触发看了,么有进去试。

但是这只是一个很少的判断,因为只有一个字符串比较。


不已恶小而不为惊到我了。

不管比较什么,实质上都是对数据的每个字节的比较。比较两个数值大小的速度是远高于加法的(比较65534和65533的大小要比算1+254快)。只要不在条件判断中使用除法、非正整数次的乘方、三角函数等,判断条件所需的时间可以忽略。多行条件判断只要第一个条件不通过后面的就不会比较,所以不会对运行产生影响。
关键是,即使你使用注册事件,星际2还是会去判断的,这和使用不使用任意事件没有关系,你在事件上填单位使用XX效果,星际2就会去判断使用的那个效果是不是XX效果,因为演算体用到这个所以一定会触发(脚本层和显示层会有事件)。

东方油瓶 发表于 2017-9-22 23:57:38

priceles 发表于 2017-9-22 23:26
不已恶小而不为惊到我了。

不管比较什么,实质上都是对数据的每个字节的比较。比较两个数值大小的速度 ...

我只是想说....

唉,我自己也不知道我在说什么了~

东方油瓶 发表于 2017-9-22 23:59:01

priceles 发表于 2017-9-22 23:26
不已恶小而不为惊到我了。

不管比较什么,实质上都是对数据的每个字节的比较。比较两个数值大小的速度 ...

学到了很多东西,多谢.

priceles 发表于 2017-9-23 12:25:00

东方油瓶 发表于 2017-9-22 23:59
学到了很多东西,多谢.

额我说的有些东西还是不准确的。
在一些高性能的64位处理器上,比较两个字节的大小耗费的时间可能和计算整型加法耗费的时间一样,这是由架构决定的(目前没发现)。

windywel 发表于 2017-9-24 09:42:18

顶楼主一个。为了优化,我也是较劲了脑汁。
页: [1]
查看完整版本: 关于伤害、行为、效果等事件注册