骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 2689|回复: 5

[经验与教程] 简单触发器simple trigger效果整理与优化建议(部分)

[复制链接]

42

主题

94

回帖

221

积分

见习骑士

Rank: 3

UID
3199602
第纳尔
1162
精华
0
互助
36
荣誉
0
贡献
1
魅力
227
注册时间
2020-9-4
鲜花(60) 鸡蛋(0)
发表于 2023-5-11 15:33:14 | 显示全部楼层 |阅读模式
本帖最后由 奥杜因阿卡托什 于 2023-5-11 15:41 编辑

       大地图优化一直是很多moder的痛点,有可能是地图太大,有可能是据点、领主太多,在大地图上时游戏会卡顿,情况严重的mod甚至会跳出。前者没什么好办法,只能在做地图时把像素调少一点了,后者会出现周期性卡顿。因为卡顿是周期性的,很容易让人联想到同样是周期性运行的trigger和simple trigger。然而这俩玩意里面的项目没有名字,功能也很难直观地看出来,moder修改时有可能投鼠忌器,不好下手,在此我就列出其中各项目的具体内容,供想要研究触发器的moder参考,同时给出我的一点优化建议。
      (卡顿时可以用个简单办法辨别原因,如果暂停游戏,把视角在大地图上挪过来挪过去都不卡的话,卡顿就是由触发器造成的。如果扎营时不动镜头就不会卡,一动镜头卡得要死要活,那就是大地图本身、部队图标、树木这些东西的问题。)

      simple trigger有点多,这里先写一部分,不过把这一部分改完也够节省大量算力了,毕竟造成卡顿的主要原因就是AI。我原本在大地图上移动时帧率长期30几,改了之后基本稳定在55以上了。不说有多丝滑吧,至少已经脱离了“卡顿”的范畴。

simple trigger(部分)

0:  (ti_on_party_encounter,
1:  (ti_simulate_battle,
开头就是两个废的,虽然不会有流畅度有什么影响,但还是删之。不过这两个触发器检测点应该还是生效的,要是不想碰script里的平替,可以试试这两个。

2:  (1,
一小时一次的参数设置,和攻城的一些东西有关。

3:  (0,
主要是修bug的触发器。触发器是一种常用的打热补丁的手法,不用新开档。好几个修复都被塞进这"$bug_fix_version"下面了。我的建议是把它们转移出去。比如,跟在这个触发器辟谷后面写一个新的ti_once。可以少一个全局变量,每零点零几秒少判断处理两行代码。真是个无比巨大的提升啊。
这个触发器下面还有几行关于玩家被俘虏的相关操作。这玩意需要(0,的触发器吗?真的没有影响吗?我对party_relocate_near_party的工作原理和意义不是特别清除,有没有人可以解答一下。

4:  (0,
又是个(0的触发器,看到就头大了,好好在没有循环。主要处理的是一个玩家在城内休息一会儿时正好被攻城的情况,要是玩家和城的阵营是正关系,和攻击者是负关系,会被直接拉进战斗。其他还有一些情况,比如被弹出来之类的。

5:  (0,
循环来啰!trp_notification_menu_types三个troop是纯纯工具人,当矩阵存储某种东西的,似乎是用来存储消息界面的数据的。这个太复杂了,而且还是纯数值运算,还是不要动它为好。

6:  (1,
按所在国家获取音乐的,看起来很简短,但是music_set_situation_with_culture这里面可是另有玄机。里面的script是一层套一层,还用到了get_closest_center这样的好汉。说到底,文化音乐是需要一个小时获取一次的东西吗?而且到底是什么文化的音乐,不特别注意根本听不出来。
所以对于这个的优化,首先是将触发时间改成4。
然后对于music_set_situation_with_culture里面的get_closest_center,最好把它换掉。我自己用了我之前写的根据坐标获取所处地区的脚本,不过简单地改,可以直接把这个脚本用随机数替代。搜索        (eq, ":situation", mtf_sit_travel),把它下面的部分改成
        (eq, ":situation", mtf_sit_travel),
        (call_script, "script_get_culture_with_party_faction_for_music", "p_main_party"),
        (val_or, ":culture", reg0),
#        (call_script, "script_get_closest_center", "p_main_party"),
        (store_random_in_range, reg0, centers_begin, centers_end),
        (call_script, "script_get_culture_with_party_faction_for_music", reg0),
        (val_or, ":culture", reg0),
随机一个得了。

7:  (0,
又一个逆天的触发器。其中两个部分感觉并不是写的同一个东西。前一段还是护送商队,如果离得远了会弹一个对话让你别离得太远。其实我觉得设成一小时一次得了。
下面那一搓是和解救领主有关的,但是它要求"$g_reset_mission_participation"大于1才能启动,这个全局变量我只在dialog里搜到过,而且都只设置为了1。也就是说这玩意不会触发,迷惑。我也给它改成了一小时一次,有问题再说。

8:(24,
每天一次,给玩家部队的各国兵种设置士气的。

9: (4,
重量级来了。这个trigger处理的是领主的女眷,应该是我目前发现的除了那个领主ai三连星外最影响流畅度的触发器。我是没明白,刷新一个女眷,为什么要4小时一次呢,贵族女人4小时真能整理完行头?所以直接大手一挥改成3,而且用我之前那个“大地图降压”里面提到的方法,直接改成一次处理24分之一的女眷,这样相当于三天内均匀处理完所有女眷,压力就大大分散了。
另外要是技术力足够的话,这个脚本里面也可以改一改。它上来就说卡拉迪亚很父权,所以女眷都得随“亲近的男人”——丈夫、父亲、guardian(不知道是什么)走,但是我这里不是卡拉迪亚,所以没必要按它的来。获取了“亲近的男人”后,就会分三种情况分别讨论女眷的位置。第一种她在开宴会,第二种她老公是玩家,这两种其实都是很少见的。第三种最多见的,却需要try for range所有镇和堡,这个双层嵌套就是卡顿的根源了。我反正是准备改这块的,一方面是从源头上降压,另一方面我觉得让女眷当花瓶浪费NPC,不如丢出去干点出使、维稳、渗透、谍报、刺杀、颜色革命、颠覆之类的事情。她力量属于是。

10:(2,
debug模式(cheatmenu)下才会启动的触发器,主要是显示信息,没必要改。

11: (24,
给女眷送信的触发器,因为我没怎么结过婚所以不太清楚这块。里面有个循环,但是结束得比较快,所以没有大碍。
我还挺想整个毙掉结婚系统的。

12:  (1,
只有玩家烧村时会触发。一般不会有影响。

13:  (24 * 7,
每周收支那个页面。

14:  (24,
雇佣兵结算的,弹出那个“是否延长雇佣合约”之类的目录的地方。

15:  (180,
骑砍尤其是有个隐藏的幸运系统的,在这里就是每180小时减少一,不知道在哪里有用。

16:  (72,
设置了一个"$lady_flirtation_location"全局变量。结婚系统的玩意儿。

17:  (4,
不知道设置了两个什么玩意。

18:  (24,
打开选择旗帜的界面,和上一个触发器是联动的。这个旗帜设置是在什么时候的?没什么有印象,代码上看应该和结婚系统有点关系。

19:  (24,
设置玩家部队的士气。

20:  (24*7,
据点每周会处理一批俘虏。如果嫌据点处理俘虏太快或太慢的,要改的就是这里。因为也有双重嵌套,我也给它分摊了一下压力。不过这个毕竟很久才有一次,不改问题也不大。

21:  (24*7,
前半段算税和收入的,打算给领主多搞点钱就改这里。后半段是城镇收入。因为一星期一次,没有多层嵌套循环,而且都是数值运算,就不降压了。

22:  (24,
第一部分领主扩兵,第二部分镇堡扩兵,第三部分繁荣。对做大地图导向mod的moder而言应该是个挺重要的simple trigger。
基本都是纯数值运算,想降压的话可以降压一下。

23:  (24*15,
这个本来是计算繁荣的,后来繁荣移到上一个触发器去了。删删删。

24:  (6,
看玩家部队是不是睡在一个休息只要半价的地方。

25:  (24,
处理外交的触发器,一上来就是战争与和平。粗略看了一下,虽然有双重嵌套,但主要是国家嵌套国家,也就是只要嵌套36次(在我这里是64次),还好。不过对于12th那种国家特多的mod,恐怕情况会变得很不妙。这个触发器太复杂了,我之后再来看看能不能操作一下。

26:  (48,
给领主刷经验升级的。战略向mod可以利用一下。另外领地也会影响领主的经验收入。

27:   (24,
28:   (2,
随时间推进攻城、烧村AI的,process_sieges、process_village_raids这两个触发器点进去看有些处理繁荣度之类的东西的内容。

29:   (7,
封臣ai(和战略AI有什么不同吗?)。AI类的东西最吃算力了,按老办法降压。

30:   (24,
整个都废弃了,干脆一点直接给它全部注释掉得了。原本大概是选元帅之类的东西。

31:   (24,
设置了一些诸如slot_troop_intrigue_impatience、slot_troop_controversy,应该是用于AI的。

32:   (8,
政策ai。那个叫Nov的人真会整狠活,我记得战斗AI里士气那一坨也是它写的,它这里又把cf_random_political_event这个script连用两遍。图个什么?

33:    (0.5,
领主个人的政治行为,比如控告某人或者叛离这个国家等。这个脚本还算有点意思,它半个小时处理一个人,一个一个地处理下去。如果按战团120领主的规模算,差不多三天循一遍。感觉上并没有0.5小时一次的卡顿,我就没改它了。

34:   (2,
空触发器,删之。

35:   (1,
最典中典的来了,致死量脚本三连星,四重嵌套的电脑杀手。怎么改这三个玩意见我之前的帖子。

36:   (3,
攻城ai,又是嵌套循环,不过它的条件还算严格,毕竟一般来说一个国同一时间只会打一座城,大地图上有个十座城同时被打顶天了,所以这个嵌套倒也不是那么要命。

37:    (6,
我发现一个很奇怪的事情,这个六小时触发器说是faction的ai,但实际上把29号那些7小时循一边的东西又获取了一遍,至于吗?因此直接删掉其中的绝大部分,只留一个
      (try_for_range, ":faction_no", kingdoms_begin, kingdoms_end),
      (assign, reg8, ":faction_no"),
        (faction_slot_eq, ":faction_no", slot_faction_state, sfs_active),
        #(neg|faction_slot_eq, ":faction_no",  slot_faction_marshall, "trp_player"),
        (call_script, "script_decide_faction_ai", ":faction_no"),
      (try_end),
就行了。

39:    (0,
上面的那个可以不看,debug模式看兵力对比的。这个触发器主要是在"$g_recalculate_ais"为一的时候重计算一次ai周围的战力环境。

39:    (24,
一天一次的计算国家的实力。

40:   (36,
踏马的,终于不是AI了。这个是任务相关的触发器,主要设置一个slot_troop_does_not_give_quest的槽,最多36小时变为0,变为0才能重新接任务。

41:   (168,
一周一次刷新村庄商品。


评分

参与人数 1第纳尔 +20 魅力 +1 收起 理由
幼稚园殺手 + 20 + 1 文章不错,继续努力!

查看全部评分

鲜花鸡蛋

ggfgfgf  在2023-7-1 15:24  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
雨落唱情歌吖  在2023-5-25 17:36  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下

0

主题

26

回帖

8

积分

平民

Rank: 1

UID
3014109
第纳尔
73
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2018-7-16
鲜花(0) 鸡蛋(0)
发表于 2023-5-25 17:36:30 | 显示全部楼层
好技巧,速度收藏起来,希望更多moder看到并积极实验

51

主题

287

回帖

101

积分

见习骑士

Rank: 3

UID
2880114
第纳尔
1576
精华
0
互助
0
荣誉
0
贡献
0
魅力
3
注册时间
2017-9-30
QQ
鲜花(12) 鸡蛋(0)
发表于 2023-5-26 10:55:17 | 显示全部楼层
啥时候能介绍一下module_mission_templates

29

主题

751

回帖

574

积分

骑士

Rank: 4Rank: 4

UID
3322408
第纳尔
1748
精华
0
互助
68
荣誉
0
贡献
0
魅力
6
注册时间
2022-2-3
鲜花(57) 鸡蛋(0)
发表于 2023-5-26 11:37:52 来自手机 | 显示全部楼层
djman 发表于 2023-5-26 10:55
啥时候能介绍一下module_mission_templates

mission_template每一个template都是比较独立的,要用什么trigger就写什么trigger,没法像这个一样整体分析。一般都是具体讲解某一个template,这种讲解我阿格兰还有其他很多人都做过。
不过讲一讲common trigger也可以。来自: Android客户端

51

主题

287

回帖

101

积分

见习骑士

Rank: 3

UID
2880114
第纳尔
1576
精华
0
互助
0
荣誉
0
贡献
0
魅力
3
注册时间
2017-9-30
QQ
鲜花(12) 鸡蛋(0)
发表于 2023-5-26 11:42:34 | 显示全部楼层
112233lyh 发表于 2023-5-26 11:37
mission_template每一个template都是比较独立的,要用什么trigger就写什么trigger,没法像这个一样整体分 ...

讲common trigger也好啊

10

主题

51

回帖

48

积分

扈从

Rank: 2Rank: 2

UID
2056346
第纳尔
314
精华
0
互助
4
荣誉
1
贡献
0
魅力
1
注册时间
2014-7-4
鲜花(24) 鸡蛋(0)
发表于 2023-8-14 00:43:34 来自手机 | 显示全部楼层
不错,学习了,谢谢
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-12-28 04:04 , Processed in 0.112110 second(s), 28 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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