MudOS源码阅读笔记 – 基本结构
脚本所操作的所有数据都是C保存的。MUD的wiz大多是从脚本开始的,所以习惯性认为脚本是程序的中心。其实lpc只是胶水。不需要太多的工作,可以把这个lpc换成其他脚本语言,比如lua。
先说数据,再说逻辑。
数据
MudOS所维护的数据最重要的是object tree。整个mudlib所操作的就是这些object。房间,npc,daemon,一切的一切都是object。这些object以子节点和兄弟节点的方式组成一棵对象树。
除了最重要的object tree,MudOS还维护着其他辅助性的信息。比如当前连接,function cache,string table,living table。通过efun,lpc可以操作和访问这些数据。
逻辑
在backend.c里有一个经典的大循环模式,这个循环展示了MudOS的工作流程:
清除标志为销毁的对象
检查是否有shutdown请求
在所有的socket上做一个select。这包括用户连接和mudlib内部的lpc所创建的socket。按linux的默认设置,不能超过1024.
io处理。包括两个动作
获取所有用户的输入,保存到buffer中
把所有给用户的输出发出去
处理lpc内部的socket读和写请求
对上一步保存到buffer中的用户输入进行处理
对输入做一些预处理,比如过滤掉ESC字符,进行big5 gbk转换等
如果该用户处于等待输入状态,处理input_to
否则,如果该用户处于ed状态,处理ed。(还有人记得ed吗?销魂的行编辑器)
否则,先调用该用户的process_input方法。这个方法可以对输入进行预处理。在es2架构里这个地方是用来做alias翻译的。process_input应该返回字符串。一些不使用action的mud,这个process_input方法就得完成命令的解析和实际动作了。
接下来执行parse_command,这里是action生效的地方。
处理心跳
调用所有有心跳物件的heart_beat函数
把不使用的物件swap到磁盘。这个功能目前没什么用了,内存不是问题。
检查所有的callout,执行已经到期的callout
回到第一步
这是一个非常非常经典的单线程大循环模式。这要求脚本的编写者必须注意不能编写长时间执行的代码。也对lpc的性能是一个挑战。根据某些测试的结果,lpc的效率不低于lua。
慢死
【 在 wew (吴钩霜雪明) 的大作中提到: 】
: 标 题: Re: MudOS源码阅读笔记 – 基本结构
: 发信站: 水木社区 (Mon Sep 3 14:29:54 2012), 站内
: 我觉得parse command应该教给mudlib来做
: 【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】
: : 他指的可能是mudos维护着所有的数据
: --
: Programming languages are not just technology,
: but what programmers think in.
: They're half technology and half religion.