MudOS源码阅读笔记 – 基本结构

goodtaste
有乐享乐,没乐刨乐 2012-09-02 字数 1736

脚本所操作的所有数据都是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。

Mud 网络泥巴
22 个回复
goodtaste
有乐享乐,没乐刨乐 2012-09-02

最近调试北侠负荷重的问题,终于系统了看些mudos的代码。以前都是改哪里看哪里。

欢迎指正

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】

: 脚本所操作的所有数据都是C保存的。MUD的wiz大多是从脚本开始的,所以习惯性认为脚本是程序的中心。其实lpc只是胶水。不需要太多的工作,可以把这个lpc换成其他脚本语言,比如lua。

: 先说数据,再说逻辑。

: 数据

: ...................

akuma
很不温柔 2012-09-03

FLAG是一个特色,

作为单线程的循环模式,mudos要做什么 大部分都是用显性的或者隐形的flag来标识

然后在他循环到的时候去执行

其实这和flash的轨道模型有点像

不过mudos没有明确的消息机制,只在和底层需要异步的时候有一些call_back的模式。

我最近在想,是否应该让mudos支持lpc层的消息呢?

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】

: 最近调试北侠负荷重的问题,终于系统了看些mudos的代码。以前都是改哪里看哪里。

: 欢迎指正

goodtaste
有乐享乐,没乐刨乐 2012-09-03

如果有可能,我想要加的是lpc里的sleep。

【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】

: FLAG是一个特色,

: 作为单线程的循环模式,mudos要做什么 大部分都是用显性的或者隐形的flag来标识

: 然后在他循环到的时候去执行

: ...................

goodtaste
有乐享乐,没乐刨乐 2012-09-03

flag这个确实是特色,本质上就是用flag实现异步操作。

【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】

: FLAG是一个特色,

: 作为单线程的循环模式,mudos要做什么 大部分都是用显性的或者隐形的flag来标识

: 然后在他循环到的时候去执行

: ...................

akuma
很不温柔 2012-09-03

foo()

{

aaaa();

sleep(x);

bbbb();

}

你说这个?

这个不太现实啊,你要实现这个,让堆栈情何以堪啊。。。

而且call_out也可以实现类似的功能,起码需求可以满足

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】

: 如果有可能,我想要加的是lpc里的sleep。

wew
吴钩霜雪明 2012-09-03

听起来看这个设计似乎有点混乱

mudos即做了网络层的内容又做了一些业务层的内容

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】

: 脚本所操作的所有数据都是C保存的。MUD的wiz大多是从脚本开始的,所以习惯性认为脚本是程序的中心。其实lpc只是胶水。不需要太多的工作,可以把这个lpc换成其他脚本语言,比如lua。

: 先说数据,再说逻辑。

: 数据

: ...................

goodtaste
有乐享乐,没乐刨乐 2012-09-03

不乱啊。这本来就是他的职责

【 在 wew (吴钩霜雪明) 的大作中提到: 】

: 听起来看这个设计似乎有点混乱

: mudos即做了网络层的内容又做了一些业务层的内容

goodtaste
有乐享乐,没乐刨乐 2012-09-03

为什么不现实。把堆栈保存起来,sleep到期后再恢复嘛

【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】

: foo()

: {

:         aaaa();

: ...................

akuma
很不温柔 2012-09-03

恢复现场这个最麻烦了

而且你想 假如一个包含有sleep的函数被呼叫了两次会怎么样。。。

如果里边还有对自己的递归会怎么样

这些都要处理吧。。。

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】

: 为什么不现实。把堆栈保存起来,sleep到期后再恢复嘛

goodtaste
有乐享乐,没乐刨乐 2012-09-03

不会的。第一次遇到sleep,这个函数就被挂机,保存现场,返回了。要等到下个循环周期才能回来继续。然后遇到下一个sleep。

【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】

: 恢复现场这个最麻烦了

: 而且你想 假如一个包含有sleep的函数被呼叫了两次会怎么样。。。

: 如果里边还有对自己的递归会怎么样

: ...................

akuma
很不温柔 2012-09-03

他没负责业务吧

哪个业务是他做的?

【 在 wew (吴钩霜雪明) 的大作中提到: 】

: 听起来看这个设计似乎有点混乱

: mudos即做了网络层的内容又做了一些业务层的内容

goodtaste
有乐享乐,没乐刨乐 2012-09-03

他指的可能是mudos维护着所有的数据

【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】

: 他没负责业务吧

: 哪个业务是他做的?

wew
吴钩霜雪明 2012-09-03

我觉得parse command应该教给mudlib来做

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】

: 他指的可能是mudos维护着所有的数据

yeung
流星雨 2012-09-03

慢死

【 在 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.

goodtaste
有乐享乐,没乐刨乐 2012-09-03

不支持add_action的,就是mudlib做的。

【 在 wew (吴钩霜雪明) 的大作中提到: 】

: 我觉得parse command应该教给mudlib来做

akuma
很不温柔 2012-09-03

也没维护啥吧

说来说去 真正是mudos在“维护”的 其实也就是个refer 这个是用来GC的 没办法的

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】

: 他指的可能是mudos维护着所有的数据

goodtaste
有乐享乐,没乐刨乐 2012-09-03

object tree

【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】

: 也没维护啥吧

: 说来说去 真正是mudos在“维护”的 其实也就是个refer 这个是用来GC的 没办法的

CGcheng
PAPER才是硬道理 2012-09-03

突然想到,当年发展的这么成熟的mudos体系,后来或者说现在有没有用到其他什么应用上啊

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】

: 脚本所操作的所有数据都是C保存的。MUD的wiz大多是从脚本开始的,所以习惯性认为脚本是程序的中心。其实lpc只是胶水。不需要太多的工作,可以把这个lpc换成其他脚本语言,比如lua。

: 先说数据,再说逻辑。

: 数据

: ...................

goodtaste
有乐享乐,没乐刨乐 2012-09-04

有啊,问akuma

【 在 CGcheng (PAPER才是硬道理) 的大作中提到: 】

: 突然想到,当年发展的这么成熟的mudos体系,后来或者说现在有没有用到其他什么应用上啊