更新方式
更新内容
0.22.2 (2026-01-11)
- 功能新增: 可以通过.cfg文件指定 "auto_chars" 来定义启动pymud时自动打开的会话。
- 问题修复: 修复GMCPTrigger类型enabled属性不生效问题。
- 问题修复: 原本enabled的定时器,修复了在会话断开重连后不会生效的问题。
- 问题修复: 修复添加/删除系统时钟回调时,可能会导致的异常问题。
- 问题修复: 修复在增加系统时钟回调时,如果回调函数代码错误产生异常,会导致系统时钟停顿的问题。
- 功能优化: 优化了SessionBuffer的实现方式,改为环形缓冲+缓存缓冲双缓冲形式,减少运行中内存分配和清除的次数。
- 功能新增: #var增加了对嵌套变量的显示支持,可以支持list、dict等嵌套类型的变量,详细请查看论坛信息。
- 功能新增: 增加了#mem/#memory命令以支持内存监控,增加了启动时的-m参数在启动时直接打开内存监控,详细请#help memory或者查看论坛信息。
- 其他变更: F1快捷键指向的帮助网站修改为官方网站的文档页面 https://www.pymud.cn/doc/
pymud.cfg文件中配置auto_chars参考用法
auto_chars是用来控制pymud在运行时自动加载某些角色的。一种使用的场景是,远程挂机的服务器重启后,自动运行pymud,然后自动登录某几个角色。其中,自动运行pymud需要使用操作系统实现,比如使用 .bashrc 指定。
下面一个pymud.cfg文件示例可以自动登录char1, char3两个角色,需要注意两点:
-
一是自动登录角色需要 pymud.cfg 中配置菜单中包含这些角色。如下例子在chars中定义了char1,char2,char3三个角色,才可以自动加载char1, char3。
-
二是自动登录autologin必须要配置好,确保可以自动输入用户名密码。 比如北侠应该配置为 "{0};{1}"。
{
"sessions": {
"pkuxkx": {
"host": "mud.pkuxkx.net",
"port": "8081",
"encoding": "utf8",
"autologin": "{0};{1}",
"default_script": ["my_entry"],
"chars": {
"char1", ["myid1", "mypass1"],
"char2", ["myid2", "mypass2"],
"char3", ["myid3", "mypass3"]
}
}
},
"auto_chars": ["pkuxkx.char1", "pkuxkx.char3"]
}
内存监控参考用法
要使用内存监控必须先启用监控。可以通过在运行pymud时指定-m参数,即 "pymud -m" (使用uv时可以用 "uv run pymud -m") 在启动时刻即启用内存监控。也可以在会话中使用 #mem on 命令启动监控。只有在启用后的内存变化才会被系统所捕获。在运行时通过 -m 启动可以捕获更为完整的内存初始情况,但由于内存监控具有一定的性能开销,因此要平衡好监控需求和实际运行。
当内存监控启用后,可以通过 #mem 命令查看监控到的当前内存的使用情况,可以使用 #mem diff 命令查看此时与上一次的内存使用的变化情况(仅显示top5)。
内存监控的总数可以按照文件统计,也可以按照代码行位置统计,当未配置时,默认按照文件统计。可以通过 #mem lineno / #mem filename 切换两种统计方式。
当不需要使用内存监控的时候,可以使用 #mem off 来关闭内存监控。
以下是几种不同方式下, #mem 和 #mem diff的显示示例:
#mem命令按filename的显示,从左到右分别为,内存分配块数,占用的内存,文件是属于库(lib)还是自己的脚本(app),文件名的相对路径。
〔MEMORY〕内存占用最大的5处为:
〔MEMORY〕 207 0.2 MiB [lib] layout/mouse_handlers.py
〔MEMORY〕 3453 0.2 MiB [lib] layout/controls.py
〔MEMORY〕 496 0.2 MiB [lib] layout/screen.py
〔MEMORY〕 1558 0.1 MiB [lib] layout/containers.py
〔MEMORY〕 1553 0.1 MiB [lib] pymud/extras.py
#mem diff命令按filename的显示,从左到右的定义与#mem一致,括号中的内容是表示与上一次相比的变化量。
〔MEMORY〕与上次内存占用对比,变化最大的5处为:
〔MEMORY〕 3233( +1632) 1.4MiB( +0.6MiB) [lib] layout/screen.py
〔MEMORY〕 8361( +3497) 0.7MiB( +0.3MiB) [lib] pymud/extras.py
〔MEMORY〕 4735( +1560) 0.6MiB( +0.2MiB) [lib] layout/containers.py
〔MEMORY〕 1130( +753) 0.1MiB( +0.0MiB) [lib] widgets/menus.py
〔MEMORY〕 667( +535) 0.1MiB( +0.0MiB) [app] script/map/map.py
执行#mem lineno之后,#mem按lineno显示内容,从左到右的定义与前面一致,最末尾增加了行号
〔MEMORY〕内存占用最大的5处为:
〔MEMORY〕 361 1.6 MiB [lib] layout/screen.py, Line 305
〔MEMORY〕 2 1.3 MiB [lib] prompt_toolkit/cache.py, Line 101
〔MEMORY〕 67 0.3 MiB [lib] layout/containers.py, Line 2045
〔MEMORY〕 1501 0.2 MiB [lib] pymud/extras.py, Line 827
〔MEMORY〕 3865 0.2 MiB [lib] pymud/extras.py, Line 209
#mem diff命令按lineno显示
〔MEMORY〕与上次内存占用对比,变化最大的5处为:
〔MEMORY〕 872( +597) 3.8MiB( +2.6MiB) [lib] layout/screen.py, Line 305
〔MEMORY〕 2( +1) 1.3MiB( +1.3MiB) [lib] prompt_toolkit/cache.py, Line 101
〔MEMORY〕 15167(+11210) 1.0MiB( +0.8MiB) [lib] layout/containers.py, Line 2075
〔MEMORY〕 140( +96) 0.6MiB( +0.4MiB) [lib] layout/containers.py, Line 2045
〔MEMORY〕 3410( +1890) 0.3MiB( +0.2MiB) [lib] layout/screen.py, Line 167
#var对嵌套变量的用法
假设我有一个名为skills的变量,用于保存自己的各项武功,结构是一个dict,内部的每一个key为武功的id,其value为一个tuple,分别表示了当前技能等级、最大技能等级、技能中文名,那么可以使用#var的不同方式及其返回值如下:
# 假设skills值为如下的复合对象,#var skills会直接会显示该值
'skills' = {
divination : (19.0, 1093.0, '占卜之术'),
evocation : (14.0, 1093.0, '招魂术'),
dodge : (1087.0, 1093.0, '基本轻功'),
finger : (1087.0, 1093.0, '基本指法'),
force : (981.01, 1093.0, '基本内功'),
parry : (1087.0, 1093.0, '基本招架'),
sword : (1061.0, 1077.0, '基本剑法'),
unarmed : (1087.0, 1093.0, '基本拳脚'),
beiming-shengong: (980.74, 1093.0, '北冥神功'),
kurong-changong : (980.0, 1093.0, '枯荣禅功'),
longxiang-hubu : (1087.0, 1093.0, '龙骧虎步'),
}
# 如果使用 #var skills[force],或者 #var skills["force"] (有无引号不影响),则显示为
skills[force] = (981.01, 1093.0, '基本内功')
# 还可以继续嵌套到下一级,比如仅取force的当前等级,可以 #var skills[force][0],则显示为
'skills[force][0]' = 981.01