jarlyyn 发表于 2024-5-11 11:43:11

杰哥瞎扯蛋之减少遍历Response使用降低服务器性能消耗。

引子:虽然女朋友(服务器)是别人(Icer)的,但我们也别站起来蹬(拼命response)是不?

最近把hclua前两个功能收尾写文档,在准备第三个功能时,引入了一个预期的概念(之后再水一贴),和人聊天应用场景时聊到了遍历的response。

首先,我能理解为什么会在遍历的每一步后加入response。

因为需要一个 当前房间内对象列表已结束的标志,好做触发。

行走可以不用response,因为有明确的出口行做标志。

而遍历与行走的不同,很多情况下,遍历需要判断当前房间是否有某个NPC或物品。

只有判断了当前房间没有感兴趣的目标,才去下个房间。

所以一步一个response,一步一个response,top cmd比icer的血液窜的都快。

那么,有没有可能减少遍历中的response使用呢?(什么,你说你走一步say一句?拉下去枪毙5分钟)

当然有,至少我遍历就不依赖response(得意).

jarlyyn 发表于 2024-5-11 11:43:43

本帖最后由 jarlyyn 于 2024-5-11 12:03 PM 编辑

先说一下我的做法吧。
首先我们要理解一个概念,什么是触发。

触发就是我们觉得在一定事件内(触发开启后到触发关闭前),服务器可能会法发送的一串文字。

而我新提出来的概念中,预期,就是所有这段事件内,服务器针对某件事的反应的全部可能,会互斥,一般只出现一种。

在遍历的场景中

当我们的触发抓到房间名时,我们就可以开始我们的预期了(房间信息结束)

根据我对普通新人思路的模拟和其他技术方案,其实房间信息结束的预期有这几种可能:


[*]GA标志(出现>)
[*]GMCP.Move
[*]超时(我等0.5秒总显示完了吧)
[*]出现非OBJ对象(基于房间格式分析)


那哪个时靠谱的?都不靠谱。

北侠是北侠,神奇的北侠,岂是区区凡人能揣测的,突出一个随心所欲,bug多,不规范……

GA标志可能会被不标准的输出打断
GMCP.move在很多下船,爬数之类的情况下不生效,还有过出bug副本出来gmcp不发送的情况
超时效率低,受网速影响大
分析房间格式分析,先不说时不时会改格式,打火鸡时会有ascii图片这种不规范的东西嵌在npc之间了解下。

所以我的方案,是同时等待这四种情况的发生(一般人前三种就行),任何一个达成条件就直接抛出room.obj_end事件,同时在当前房间信息打上标记,不重复抛。

如果都不起效,我也会在触发房间名后reset一个0,5s的timer,强制结束房间信息。延迟都超过0.5了,你还做啥任务啊……

再绑定一个room.obj_end事件,来Simulate文字,来代替原先的response驱动远有机器。

这下你的topcmd就降下来了,跑的也就更快了,topcmd就又上去了……

jarlyyn 发表于 2024-5-11 11:44:14

本帖最后由 jarlyyn 于 2024-5-11 12:22 PM 编辑

下面是私货

好了,很明显,我提这个问题,就是为了我正在构思中的 “预期”这个概念预热。
触发,在我现在的思路里,其实分为 服务器主动发起的(事件),和对我们的操作的反馈。

预期就是指,我们对服务器发送指令的目的,我们期盼的服务器的几种反馈。

可能是触发(^> $)
可能是事件(gmcp)
可能是时间(0.5s)

任何一个触发了,就标志着预期完成了,一起失效了(这也就是我们频繁开开关关触发组的目的)

同时,我们在开始预期的时候,就有很明确的预期失效目标
可能是超时(1s后这些就别判断了,超时了大哥)
可能是事件(比如进入新房间,enter_room)。

因此,我觉得,我可以通过这样的方式(伪代码)来创建我们的预期


yuqi.new('game.quit','enter_room')--失效事件
:expiredAfter(10)--失效时间
:waitForRegexp('^> $',function()end)--预期正则
:waitForEvent('GMCP.MOVESuccess',function()end)--预期事件
:waitForSeconds(0.5,function()end)--预期时间
:onFail(function):


这样的优点有两个
[*]可读性高,这个功能要做啥一样能看出来,而且封闭性好,不容易冲突
[*]在创建触发时就定义了什么时候关闭触发,不需要再在不同的位置去关闭触发,最多在处理函数里取消关闭。这样写起来容易,维护容易,心智负担低。

恩,就是个想法,怎么实现比较好还在构思。

jarlyyn 发表于 2024-5-11 11:44:46

本帖最后由 jarlyyn 于 2024-5-11 12:25 PM 编辑

这里不是私货
如果是其他情况下要使用response怎么办?

比如需要将异步指令同步化(确保之前的指令都发送完毕)?

个人建议不要使用response了

用checkbusy吧。

毕竟response还有变量处理,有储存,有拼接

checkbusy正常来说就是单纯根据忙和不忙返回两个固定字符串,同样的功能性能消耗低很多。

就是代码需要做一定的适配。

risc 发表于 2024-5-11 11:47:44

办法:
tune gmcp move on
大部分房间(几乎所有),当你切换房间的时候,都是以房间名称开头,以gmcp的move true为标志,中间出现的内容都是这个房间相关的内容。
把中间内容临时保存下来,检测到move true的时候使用回调函数进行处理即可。

xjl 发表于 2024-5-11 11:47:45

Simulate("\\n系统回馈:action = %1\\n")

jarlyyn 发表于 2024-5-11 12:22:25

code标签这是炸了吧?

hniu 发表于 2024-5-11 13:43:05

可以的,继续继续

readmagy 发表于 2024-5-11 14:00:10

想复杂了吧
服务器应该不在乎那几个response

jarlyyn 发表于 2024-5-11 14:08:01

readmagy 发表于 2024-5-11 02:00 PM
想复杂了吧
服务器应该不在乎那几个response

那是你没见过resposne 排top cmd第一的截图……
页: [1] 2 3
查看完整版本: 杰哥瞎扯蛋之减少遍历Response使用降低服务器性能消耗。