ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

librmx基础库深度剖析:Sonic 3 A.I.R.底层rmxbase与rmxmedia框架设计完全指南

librmx基础库深度剖析:Sonic 3 A.I.R.底层rmxbase与rmxmedia框架设计完全指南

【免费下载链接】sonic3air

Source and data to build Sonic 3 A.I.R. (Angel Island Revisited) and the Oxygen Engine

项目地址:https://gitcode.com/gh_mirrors/so/sonic3air
点击查看免费下载

📌librmx是 Sonic 3 A.I.R.(《Sonic 3 & Knuckles》同人重制版)仓库中的 C++ 基础库集合,由rmxbase(通用工具类)与rmxmedia(基于 SDL + OpenGL 的游戏框架)两大核心组成,为上层 Oxygen Engine 引擎提供字符串、数学、位图、文件、音频、渲染等全部底层能力。本文带你快速看懂它的分层设计与关键模块。

librmx 是什么:Sonic 3 A.I.R. 的三层地基

在官方 README.md 中,作者把整个仓库描述为"自下而上"的分层结构:

层级模块作用
外部依赖SDL、Ogg/Vorbis、zlib、curl、imgui(framework/external/)跨平台多媒体与网络能力
基础库librmx(rmxbase + rmxmedia)游戏框架:文件、数学、位图、音频、渲染、线程
引擎层Oxygen Engine(Oxygen/oxygenengine/)输入、图形、音频、模拟 Sega Genesis 硬件
游戏层Sonic 3 A.I.R. 脚本与 C++ 代码关卡、角色、MOD 支持

librmx 源码集中在 librmx/ 目录,由三个库组成:

  • rmxbase—— 纯 C++ 工具集,不依赖图形硬件;
  • rmxmedia—— 构建在 SDL 与 OpenGL 之上的游戏应用框架;
  • rmxext_oggvorbis—— Ogg/Vorbis 音频解码扩展。

三个库都提供统一的初始化宏INIT_RMX(定义于 rmxmedia.h),一行调用完成全部底层初始化。

跨平台基石:一份代码,8 个平台

librmx 的多平台能力来自 PlatformDefinitions.h,它根据编译器宏自动识别目标平台:

  • PLATFORM_WINDOWS/PLATFORM_LINUX/PLATFORM_MAC
  • PLATFORM_ANDROID/PLATFORM_IOS
  • PLATFORM_WEB(emscripten 编译的 Web 版)
  • PLATFORM_SWITCH/PLATFORM_VITA(主机移植)

配套的 export.h 负责 DLL/静态库的符号导出,而 rmxmedia_sdl3_compat.h 则通过宏重命名兼容了 SDL2 与 SDL3 两套 API——这就是 Sonic 3 A.I.R. 能同时运行在 PC、手机、浏览器和游戏主机上的底层原因。

rmxbase:字符串、数学与位图三大支柱

1️⃣ Bitmap:加载像素艺术的核心类

rmxbase 的 bitmap/ 模块用Bitmap与PaletteBitmap两类统一管理图像数据:

  • Bitmap支持 4/8/16/24/32 位色深转换(见 Bitmap.h);
  • 内置 BMP、PNG、JPG、ICO 四种编解码器(BitmapCodecs.h),采用"按格式注册解码器"的策略,易于扩展;
  • 配合InputStream/OutputStream抽象,位图既可来自磁盘,也可来自压缩包或网络流。

游戏中的角色精灵正是通过它解码的,下图是 Sonic 的完整精灵图集:

2️⃣ 文件虚拟文件系统:挂载点设计

FileSystem.h 是 rmxbase 中设计最巧妙的一块。它把"文件来源"抽象为可插拔的FileProvider,并支持挂载点(Mount Point)机制:

FTX::FileSystem->addMountPoint(*provider, L"data/", basePath + L"data/", 0x10);

不同 Provider 按优先级依次查找文件——这正是 Sonic 3 A.I.R. 实现 MOD 热加载的关键:引擎把data/目录、MOD 的 zip 包按优先级挂载到同一虚拟路径下(见 EngineMain.cpp),上层代码读写data/sprites/xxx.png时根本感知不到资源来自哪里。

3️⃣ 数学库与内存工具

  • math/Math.h 提供Vec2/3/4、Mat3/4、Rect、Box、Ray、Plane等几何类型及射线-平面相交等运算函数,覆盖了 2D 游戏所需的全部向量数学;
  • memory/ 提供String(带 UTF-8 转换)、ObjectPool对象池、BinarySerializer二进制序列化、RmxDeflate/ZlibDeflate压缩;
  • data/ 提供SmartPtr、Singleton等所有权辅助类。

rmxmedia:SDL + OpenGL 之上的游戏框架

rmxmedia 把 SDL 的窗口/输入/音频能力和 OpenGL 渲染封装成一套"开箱即用"的框架,入口见 rmxmedia.h。

FTX 全局单例:框架的"门面"

rmxmedia.h 声明了五个全局单例,构成整个框架的门面(Facade):

单例类型职责
FTX::SystemSystemManager主循环、计时、键盘鼠标状态
FTX::VideoVideoManager窗口创建、尺寸、渲染目标
FTX::AudioAudioManager音频缓冲与混音
FTX::PainterPainterOpenGL 2D 绘制:矩形、纹理、文字、裁剪
FTX::JobManagerJobManager多线程任务队列

开发者只需继承GuiBase实现initialize()/update()/render()三个虚函数,即可得到一个完整的游戏应用骨架。

输入与多线程

InputContext统一处理键盘、鼠标、手柄事件;JobManager则用工作线程池执行后台任务(如资源异步加载),支持按优先级插入作业。移动端触摸按键的贴图资源就来自引擎的输入系统:

渲染管线:从 Texture 到 Painter

opengl 子模块包含Texture、Shader、Framebuffer、VertexArrayObject、SpriteAtlas(精灵图集)等组件。Painter在其之上提供drawRect()、print()、setScissor()等高层 API——Oxygen Engine 的画面输出全部建立在这条管线之上。音频侧则用AudioBuffer+ AudioMixer(支持树形混合器结构)完成混音。

rmxext_oggvorbis:Ogg 音频扩展

OggLoader 将 libogg/libvorbis 包装成 rmxmedia 音频系统的"插件",配合INIT_RMXEXT_OGGVORBIS宏完成初始化(见 EngineMain.cpp)。Ogg 流的复用原理如下图所示:

Hello World:rmx_test 最小示例

仓库自带的最小演示 rmx_test/main.cpp 展示了标准使用流程,非常值得新手阅读:

  1. INIT_RMX;—— 初始化全部底层库;
  2. FTX::System->initialize();—— 启动系统管理器;
  3. FTX::Video->initialize(rmx::VideoConfig(false, 1200, 672, "rmx_test"));—— 创建 1200×672 窗口;
  4. FTX::System->run<App>();—— 进入主循环运行自定义的App类;
  5. FTX::Video->setPixelView();—— 以"像素视图"模式渲染,保证重制版游戏在高分屏下的锐利像素效果。

整个"窗口 + 主循环 + 渲染"只用了不到 15 行代码,这就是 rmxmedia 框架抽象的价值。

总结:为什么这样设计?

🏁 librmx 的设计可以概括为三条主线:

  • 严格分层:rmxbase 零图形依赖、rmxmedia 只管"框架"不管"游戏"、Oxygen 负责引擎逻辑——各层可独立复用;
  • 面向抽象:FileProvider挂载点、位图解码器、SDL2/SDL3 兼容层,全部用接口隔离变化,让 MOD 系统和跨平台成为"免费获得"的能力;
  • 门面式 API:五个FTX单例 +GuiBase模板,把复杂系统收敛成极小的学习成本。

如果你想深入,建议从 librmx/source/rmxbase.h 的模块清单、rmxmedia.h 的模块清单,再到 rmx_test/main.cpp 的顺序通读一遍,即可完整掌握 Sonic 3 A.I.R. 的地基设计。

【免费下载链接】sonic3air

Source and data to build Sonic 3 A.I.R. (Angel Island Revisited) and the Oxygen Engine

项目地址:https://gitcode.com/gh_mirrors/so/sonic3air
点击查看免费下载
上一篇:如何让AI语音拥有真情实感?Higgs TTS 3-4B带你开启100+语言的情感对话新时代
下一篇:GetQzonehistory:把QQ空间历史说说全部导出成本地Excel,含图片与评论

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进