一个机器极限优化showcase
最近一直在更新我得一个非北侠机器,进入到了主要功能全部完成,开始卡稳定性和效率接阶段。正好把最近做的一个优化贴出来。
背景介绍:
优化一个类似慕容送信1阶段得任务。给定城市,遍历找npc,击杀npc,砍头,回master处交任务。NPC可能会出帮手或者逃跑。逃跑需要去ASK信息。
目标:成型ID稳定任务效率在500+任务/小时,包含练功。
1小时500任务大概是7秒左右一个任务,其中1秒战斗出pfm,1秒等NPC昏迷砍头,一秒接任务后有固定Busy。
剩下得4秒要完成遍历,买食物水,修武器,学习,练习,汲取(类似打坐),找跑路NPC等所有工作。
首先是充分打满指令限制。
该mud是每2秒最多输入50指令,超过会被雷P。
所以几年前我就实现了一个节拍器得机制,在我得hclua中也有
https://www.pkuxkx.com/forum/thread-49204-1-1.html
具体简单来说,就是每隔指令发送后,会记录一个发送记录,只有达到一定时间后(比如2秒),才会清除记录
如果发送时,未清除的记录达到指定数量,就会存入缓存,等有发送空间再发送。
这样能保证任何一个连续时间段(比如2秒)内,发送的指令都不会达到服务器上限(比如50),实现极限利用的目的。 在进行了长达几周的观测和调整后。
我发现,各种优化在前人的基础上已经做的差不多了。只有汲取(类似打坐)的时间,虽然无法优化,但可以想办法偷一点时间出来。
前面说过,我是利用节拍器的机制,保证指令尽快发送。所以,实际的发送,比如遍历,是先快速的把指令空间打满,比如在半秒内遍历20多个房间,然后进入缓存满,羊拉屎的节奏。
大概是
快,快,慢,慢,慢,慢,慢,快,快,慢,慢,慢,慢,慢, 这样循环。
而根据mud的特点,汲取(打坐)不看实际的时间片,而是在心跳时在汲取(打坐状态)就行。
所以我考虑,在 buff满的阶段,完全可以停止移动,汲取一下,1秒后halt,这样正好空出指令空间,来一波快速行走。
这样1秒的汲取,可能只慢了0.2s,能偷到0.8s
做了个简单表格示意。明显在0.1秒纬度的切片里有很多不发送指令的等待阶段,只要把这部分空间利用,拼接起来为完整的一个1秒,就能偷时间了。
然后时具体的实现。
实现其实很简单,只要移动功能有很好的模块化,那么必然有一个移动完成确认的过程
在移动完成确认的时候,检查下队列可发送空间(指令数-未过期指令),小于2就进入汲取阶段就行。当然,实际设置比这个复杂的多。
参考代码
data/attachment/forum/50a08659b6665ba25bc39f46c0e7297a.png
如果设置关闭偷时间功能,判断剩余空间不多,就进入暂停阶段,给移动做个快照,停止1秒,halt然后恢复快照继续。
实际效果
实际的优化效果
所以mud有很多种玩法
肝是一种玩法
吹水是一种玩法
调机器也是种玩法。
玩对路了,都挺有意思的。
页:
[1]