[摘要] 众所周知,
M.A.M.E是目前世界上支持驱动最多、模拟精确程度最高、开发团队实力最强及影响力最为广泛的通用
街机模拟器。本文以Mame 0.105b为例,尝试从编译配置和源码结构角度出发,简要分析和描述了Mame的软件架构,并且详细论述了Mame的配置、编译及裁剪过程。作为一篇启蒙性质的文章,本文主要面向希望深入了解Mame的模拟新手,以及对Mame源码感兴趣、且具备一定技术水平的模拟老手。
1. Mame源码结构
Mame 0.105b源代码目录树结构如下:
makefile是一种用于自动编译的特殊脚本,里面记录了所有源码的编译步骤、规则及相互依赖关系,多用于跨平台的命令行编译场合。它可以类比于我们熟悉的Windows中VC++的"工程文件",但是与IDE自动生成的工程文件不同,makefile脚本一般由开发者手工编写。为简洁起见,在Mame的makefile中定义了大量模板规则(pattern rule),同时,其整套编译脚本也从功能性的角度被划分为如下6个文件:
其中,后5个mak脚本用来生成相应的功能模块,而作为主控脚本./makefile则负责调用(include)上述的5个mak脚本,实现5个功能模块的链接并生成最终的mame.exe文件。
2. Mame软件架构
2.1 总体架构
早期Mame的软件架构变动得非常频繁,只有
Nicola Salmoria和
Aaron Giles等少数几个教父级核心开发者才能把握其细节。随着Mame的逐步成熟及其支持驱动数量的日趋庞大,
Mame Team已经充分意识到了架构稳定的重要性,并终于在2005年的上半年宣布Mame的结构基本定型,这同时也说明:从源码分析角度一窥其堂奥的机会终于成熟了。鉴于0.106u2版之后的Mame引入了全新的显示系统,该系统目前仍在测试中,因此在这里我们将主要以较新的0.105稳定版作为具体分析实例。
根据Mame的源码及makefile编译结构,我们可得出其目前的总体架构图如上。如图所示,整个Mame架构可划分为核心层和OSD层共2个层次;其中的核心层又引用了驱动、CPU核心及声音芯片核心等3个模块,它们都是平台无关的;而针对Windows的OSD层则为核心层集中提供了面向操作系统的具体实现接口,所有的Win32 API和DirectX实际调用均由OSD层来实现。可以看出,通过替换OSD层,可以很方便地将Mame移植到不同的操作系统中,并使用不同的底层多媒体控制机制,如
MacOS-
Linux/
SDL等,但是反过来,这种具备良好移植性的分层结构恰恰也是导致Mame模拟效率低下的主要原因之一,对移植性的追求使得Mame不可能100%的充分利用平台相关的硬件加速能力。