天下盛境这个项目让我萌生退意了,拖延了一个多月,没想到公司居然先解散了。接着是面试,入职新公司,回头看来,还是感慨人算不如天算阿。

新公司也是游戏行业的,初看了下项目的架构,与以前的有较大差别,是一套脱胎于 MudOS 的异步 IO、多进程的游戏架构。于是最近在研究 Mudos 的相关知识。刚刚入门,挑了最简单的 Lil Mudlib 进行学习,Mudos 的版本为 v22.2b14,既能够成功跑起来接受玩家的链接,又不会有复杂的功能阻碍理解,正好动手边改边学。

LPC 是一门专门为 Mudos 而设的脚本语言,类 c 语法,而且后缀名均为 c(这点比较让我困惑,搞不清什么是 c 什么是 LPC)。已经习惯了 Python 的我不太适应变量声明,幸好最近用 go 做了点小东西,不至于对类型系统太生疏。这门脚本语言主要是用来写逻辑的,所以很多接口都是基于底层用 c 写就的 mudos 接口。基本的 hash 表,字符串处理等都有了,可惜提供的库实在太少,不利于基于这门语言自身去了解它。比如说,python 里用 globals() 和 locals() 就可以查看当前的变量空间,有比较丰富的反射机制。而 LPC 不是没有,而是没有直接提供出来供调用,它是利用 mudos 做解释器的,类似的反射功能都需要调用 mudos 来完成。进一步来说,LPC 是用来定义和管理对象的,而这些对象的相互作用最终还是要通过 mudos 来完成。

LPC 的 OO 跟 go 语言有点相似,就是函数和变量组成。函数就是可以用名字来引用的一组指令,而变量则是供函数使用的储存信息用的容器,一个 lpc 文件对应的就是一个类的定义(这点非常喜欢)。它的类型系统还提供了一个特殊类型 mixed,类似于 go 语言的万能接口,可以存放任意类型的变量,同时可以在后期查到该变量的真正类型。

LPC 的虚拟机,即 Mudos,还提供了一个有用的功能,任何对象的执行都会被进行统计,同一调用链中,若某对象用完了所分配的时间线,就会被强制停止。这个功能有点类似 python 的 gil,任何线程都不能长期占用 gil,即使只有单线程,还是有 gil 的获取和释放过程。