杰哥瞎扯蛋之减少遍历Response使用降低服务器性能消耗。
引子:虽然女朋友(服务器)是别人(Icer)的,但我们也别站起来蹬(拼命response)是不?最近把hclua前两个功能收尾写文档,在准备第三个功能时,引入了一个预期的概念(之后再水一贴),和人聊天应用场景时聊到了遍历的response。
首先,我能理解为什么会在遍历的每一步后加入response。
因为需要一个 当前房间内对象列表已结束的标志,好做触发。
行走可以不用response,因为有明确的出口行做标志。
而遍历与行走的不同,很多情况下,遍历需要判断当前房间是否有某个NPC或物品。
只有判断了当前房间没有感兴趣的目标,才去下个房间。
所以一步一个response,一步一个response,top cmd比icer的血液窜的都快。
那么,有没有可能减少遍历中的response使用呢?(什么,你说你走一步say一句?拉下去枪毙5分钟)
当然有,至少我遍历就不依赖response(得意).
本帖最后由 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 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 12:25 PM 编辑
这里不是私货
如果是其他情况下要使用response怎么办?
比如需要将异步指令同步化(确保之前的指令都发送完毕)?
个人建议不要使用response了
用checkbusy吧。
毕竟response还有变量处理,有储存,有拼接
checkbusy正常来说就是单纯根据忙和不忙返回两个固定字符串,同样的功能性能消耗低很多。
就是代码需要做一定的适配。
办法:
tune gmcp move on
大部分房间(几乎所有),当你切换房间的时候,都是以房间名称开头,以gmcp的move true为标志,中间出现的内容都是这个房间相关的内容。
把中间内容临时保存下来,检测到move true的时候使用回调函数进行处理即可。 Simulate("\\n系统回馈:action = %1\\n") code标签这是炸了吧? 可以的,继续继续 想复杂了吧
服务器应该不在乎那几个response readmagy 发表于 2024-5-11 02:00 PM
想复杂了吧
服务器应该不在乎那几个response
那是你没见过resposne 排top cmd第一的截图……