- 好友
- 4
- 在线时间
- 0 小时
- 最后登录
- 2024-11-16
见习骑士
- UID
- 3199602
- 第纳尔
- 1162
- 精华
- 0
- 互助
- 36
- 荣誉
- 0
- 贡献
- 1
- 魅力
- 227
- 注册时间
- 2020-9-4
鲜花( 60) 鸡蛋( 0)
|
本帖最后由 奥杜因阿卡托什 于 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,
一周一次刷新村庄商品。
|
评分
-
查看全部评分
鲜花鸡蛋ggfgfgf 在2023-7-1 15:24 送朵鲜花 并说:我非常同意你的观点,送朵鲜花鼓励一下 雨落唱情歌吖 在2023-5-25 17:36 送朵鲜花 并说:我非常同意你的观点,送朵鲜花鼓励一下
|