发信人: goodtaste (有乐享乐,没乐刨乐), 信区: Mud
标 题: [合集] MudOS源码阅读笔记 – 基本结构
发信站: 水木社区 (Thu Sep 13 10:39:08 2012), 站内

☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Sun Sep 2 22:52:27 2012) 提到:

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




☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Sun Sep 2 22:53:09 2012) 提到:

最近调试北侠负荷重的问题,终于系统了看些mudos的代码。以前都是改哪里看哪里。
欢迎指正
【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】
: 脚本所操作的所有数据都是C保存的。MUD的wiz大多是从脚本开始的,所以习惯性认为脚本是程序的中心。其实lpc只是胶水。不需要太多的工作,可以把这个lpc换成其他脚本语言,比如lua。
: 先说数据,再说逻辑。
: 数据
: ...................



☆─────────────────────────────────────☆
akuma (很不温柔·PureLpc) 于 (Mon Sep 3 09:35:54 2012) 提到:

FLAG是一个特色,
作为单线程的循环模式,mudos要做什么 大部分都是用显性的或者隐形的flag来标识
然后在他循环到的时候去执行
其实这和flash的轨道模型有点像

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

我最近在想,是否应该让mudos支持lpc层的消息呢?
【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】
: 最近调试北侠负荷重的问题,终于系统了看些mudos的代码。以前都是改哪里看哪里。
: 欢迎指正




☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Mon Sep 3 10:31:14 2012) 提到:

如果有可能,我想要加的是lpc里的sleep。
【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】
: FLAG是一个特色,
: 作为单线程的循环模式,mudos要做什么 大部分都是用显性的或者隐形的flag来标识
: 然后在他循环到的时候去执行
: ...................



☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Mon Sep 3 10:51:06 2012) 提到:

flag这个确实是特色,本质上就是用flag实现异步操作。
【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】
: FLAG是一个特色,
: 作为单线程的循环模式,mudos要做什么 大部分都是用显性的或者隐形的flag来标识
: 然后在他循环到的时候去执行
: ...................



☆─────────────────────────────────────☆
akuma (很不温柔·PureLpc) 于 (Mon Sep 3 10:57:56 2012) 提到:

foo()
{
aaaa();
sleep(x);
bbbb();
}

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

而且call_out也可以实现类似的功能,起码需求可以满足
【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】
: 如果有可能,我想要加的是lpc里的sleep。




☆─────────────────────────────────────☆
wew (吴钩霜雪明) 于 (Mon Sep 3 11:10:22 2012) 提到:


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

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

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】
: 脚本所操作的所有数据都是C保存的。MUD的wiz大多是从脚本开始的,所以习惯性认为脚本是程序的中心。其实lpc只是胶水。不需要太多的工作,可以把这个lpc换成其他脚本语言,比如lua。
: 先说数据,再说逻辑。
: 数据
: ...................



☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Mon Sep 3 11:37:57 2012) 提到:

不乱啊。这本来就是他的职责
【 在 wew (吴钩霜雪明) 的大作中提到: 】
: 听起来看这个设计似乎有点混乱
: mudos即做了网络层的内容又做了一些业务层的内容




☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Mon Sep 3 11:38:25 2012) 提到:

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

【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】
: foo()
: {
: aaaa();
: ...................



☆─────────────────────────────────────☆
akuma (很不温柔·PureLpc) 于 (Mon Sep 3 12:22:54 2012) 提到:

恢复现场这个最麻烦了

而且你想 假如一个包含有sleep的函数被呼叫了两次会怎么样。。。
如果里边还有对自己的递归会怎么样
这些都要处理吧。。。
【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】
: 为什么不现实。把堆栈保存起来,sleep到期后再恢复嘛




☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Mon Sep 3 12:54:40 2012) 提到:

不会的。第一次遇到sleep,这个函数就被挂机,保存现场,返回了。要等到下个循环周期才能回来继续。然后遇到下一个sleep。
【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】
: 恢复现场这个最麻烦了
: 而且你想 假如一个包含有sleep的函数被呼叫了两次会怎么样。。。
: 如果里边还有对自己的递归会怎么样
: ...................



☆─────────────────────────────────────☆
akuma (很不温柔·PureLpc) 于 (Mon Sep 3 13:55:44 2012) 提到:

他没负责业务吧

哪个业务是他做的?

【 在 wew (吴钩霜雪明) 的大作中提到: 】
: 听起来看这个设计似乎有点混乱
: mudos即做了网络层的内容又做了一些业务层的内容




☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Mon Sep 3 14:26:03 2012) 提到:

他指的可能是mudos维护着所有的数据
【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】
: 他没负责业务吧
: 哪个业务是他做的?




☆─────────────────────────────────────☆
wew (吴钩霜雪明) 于 (Mon Sep 3 14:29:54 2012) 提到:


我觉得parse command应该教给mudlib来做
【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】
: 他指的可能是mudos维护着所有的数据




☆─────────────────────────────────────☆
yeung (流星雨) 于 (Mon Sep 3 14:35:02 2012) 提到:


慢死

【 在 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.
:
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 123.125.116.*]




☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Mon Sep 3 15:59:37 2012) 提到:

不支持add_action的,就是mudlib做的。
【 在 wew (吴钩霜雪明) 的大作中提到: 】
: 我觉得parse command应该教给mudlib来做




☆─────────────────────────────────────☆
akuma (很不温柔·PureLpc) 于 (Mon Sep 3 17:59:48 2012) 提到:

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

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】
: 他指的可能是mudos维护着所有的数据




☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Mon Sep 3 18:22:26 2012) 提到:

object tree
【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】
: 也没维护啥吧
: 说来说去 真正是mudos在“维护”的 其实也就是个refer 这个是用来GC的 没办法的




☆─────────────────────────────────────☆
CGcheng (PAPER才是硬道理) 于 (Mon Sep 3 23:46:45 2012) 提到:

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

【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】
: 脚本所操作的所有数据都是C保存的。MUD的wiz大多是从脚本开始的,所以习惯性认为脚本是程序的中心。其实lpc只是胶水。不需要太多的工作,可以把这个lpc换成其他脚本语言,比如lua。
: 先说数据,再说逻辑。
: 数据
: ...................



☆─────────────────────────────────────☆
goodtaste (有乐享乐,没乐刨乐) 于 (Tue Sep 4 08:24:31 2012) 提到:

有啊,问akuma
【 在 CGcheng (PAPER才是硬道理) 的大作中提到: 】
: 突然想到,当年发展的这么成熟的mudos体系,后来或者说现在有没有用到其他什么应用上啊




☆─────────────────────────────────────☆
akuma (很不温柔·PureLpc) 于 (Tue Sep 4 09:40:44 2012) 提到:

天下1 大话西游1/2 问道 万王之王

特别是 问道 也就是吉比特他们家 连客户端的脚本也是lpc
【 在 goodtaste (有乐享乐,没乐刨乐) 的大作中提到: 】
: 有啊,问akuma




☆─────────────────────────────────────☆
wew (吴钩霜雪明) 于 (Tue Sep 4 13:56:16 2012) 提到:


天下2、3还是这套么?

【 在 akuma (很不温柔·PureLpc) 的大作中提到: 】
: 天下1 大话西游1/2 问道 万王之王
: 特别是 问道 也就是吉比特他们家 连客户端的脚本也是lpc




☆─────────────────────────────────────☆
akuma (很不温柔·PureLpc) 于 (Tue Sep 4 14:50:06 2012) 提到:

2用了一部分bigworld吧 已经不是这套东西了
大话3也不是
【 在 wew (吴钩霜雪明) 的大作中提到: 】
: 天下2、3还是这套么?