open-sourcegameracingpsx-demakeretro-reimplementation type: concept 创建: 2026-04-09 更新: 2026-04-09
wipEout Rewrite
wipEout (1995 PSX) 清洁室重实现,纯 C 语言跨平台复刻
基本信息
核心技术点
双后端平台架构
- SDL2 后端: 支持游戏手柄,OpenGL 2.x
- Sokol 后端: 不支持手柄,OpenGL 3.3,仅支持 macOS/Linux/Win/Emscripten
- 平台抽象层
platform_*.c 隔离输入、音频、窗口管理
- 新平台移植:从 dummy 实现开始
-DPLATFORM=NULL -DRENDERER=NULL
三渲染器架构
- GL: OpenGL 3.3(现代 GPU)
- GLES2: OpenGL ES 2(移动端/嵌入式)
- SOFTWARE: 纯软件渲染(无 GPU 要求)
render_*.c 各自独立实现,共享 render.h 接口
资产分离设计
- 代码仓库不包含游戏资产(纹理、3D 模型)
- 需自行提供 PSX NTSC 数据 + PC 版菜单模型
- 音乐需转换为 QOA 格式(phoboslab 自创)
- 目录结构固定:
./wipegame + ./wipeout/textures/ + ./wipeout/music/
QOA 音频格式
- phoboslab 自创的轻量音频格式,专为游戏设计
- 比 MP3/OGG 更适合嵌入式/即时播放
- 同仓库的
qoa 项目提供格式规范和工具
CMake 构建配置
| Flag |
说明 |
选项 |
| PLATFORM |
目标平台 |
SDL2, SOKOL, NULL |
| RENDERER |
渲染器 |
GL, GLES2, SOFTWARE, NULL |
| USE_GLVND |
NVIDIA 供应商无关调度 |
ON/OFF |
| MINIMAL_BUNDLE |
Web 构建不包含音乐/开场视频 |
ON/OFF |
| DEV_BUILD |
开发模式(资产路径指向源码目录) |
ON/OFF |
源码结构
src/
├── platform_sdl.c # SDL2 平台实现
├── platform_sokol.c # Sokol 平台实现
├── platform_null.c # Dummy 空实现
├── render_gl.c # OpenGL 3.3 渲染器 (~28K)
├── render_software.c # 软件渲染器 (~18K)
├── render_null.c # Dummy 渲染器
├── input.c # 手柄/键盘输入处理
├── mem.c # 内存管理
├── system.c # 系统初始化
├── types.c # 类型定义
├── utils.c # 工具函数
└── wipeout/ # 游戏逻辑
├── game.c # 核心游戏循环 (~23K)
├── object.c # 游戏对象系统 (~22K)
├── main_menu.c # 主菜单 (~24K)
├── ingame_menus.c # 游戏中菜单 (~14K)
├── hud.c # HUD 显示
├── race.c # 竞速逻辑
├── scene.c # 场景管理
├── camera.c # 摄像机系统
├── droid.c # AI 敌人
├── sfx.c # 音效
├── image.c # 图像加载
├── particle.c # 粒子效果
└── intro.c # 开场动画
玩法特点
- 经典 anti-gravity 赛车(浮空赛车)
- 8 支球队,12 条赛道
- 武器系统(导弹、机枪、护盾等)
- 音轨播放(QOA 格式)
对公司 AI 游戏的参考价值
| 方向 |
启示 |
| 平台抽象 |
SDL2/Sokol 双后端设计为跨平台移植提供清晰模板 |
| 渲染器解耦 |
三渲染器架构(GL/GLES/Software)便于适配不同硬件 |
| 资产与代码分离 |
运行时加载外部资产,无需修改代码即可换肤 |
| CMake 参数化构建 |
通过 flag 灵活切换平台/渲染器,无需维护多套 CMakeLists |
| QOA 音频格式 |
自创格式解决版权+性能问题,适合游戏专项优化 |
| Web 移植 |
Emscripten + Sokol 后端支持浏览器原生运行 |
相关链接