介绍
本项目计划设计一款掌上游戏机, 性能类似梦幻主机pico-8, 使用pico的可编程io功能进行视频/音频加速.
背景
Raspberry Pi Pico(以下简称pico)是一款搭载RP2040芯片的开发板, 个人认为最特别是拥有可编程IO模块(PIO), 初步研究觉得这个类似于CPU微码, 指令非常简单, 但是具备图灵完备性, 拥有一般编程语言的计算能力. 由于PIO可以独立计算, 并拥有较高的数据处理速度, 所以可以辅助单片机进行大量简单重复计算, 分担mcu计算压力, 可以类比PC系统中的显卡/声卡/网卡之类的外设.
除了PIO, pico使用了statelss设计, rp2040芯片没有内置flash, 而是将宝贵的片上空间留给了sram, 拥有264KB的超大ram(期待单位是MB/GB的小伙伴, 考虑价格啊, $4). 大ram是运行解释型语言必不可少的优势.
PIO + 大RAM是我愿意选择pico实现游戏机开发的原因. 我要实现的游戏机是一款能够运行pico-8游戏的游戏机.
pico-8是Lexaloffle Games开发的一款虚拟机+游戏引擎. 虚拟机部分的配置如下:
Display | 128x128 16 colours | |
Cartridge Size | 32k | |
Sound | 4 channel chip blerps | |
Code | Lua | |
Sprites | 256 8x8 sprites | |
Map | 128x32 cels |
游戏引擎方面, 基于Lua语言, 配备8位游戏开发常用的API.
比较知名的游戏 蔚蓝(celeste)最早便是在pico-8上开发的, 游戏节奏流畅, 音乐好听, 获得过很多奖项. 下面是通关视频:
https://www.bilibili.com/video/BV1Fp411Z7yf?from=search&seid=1588204756762211513
所以, 8位游戏表现能力还是很强的, 当然前提是你得先是一名牛x的游戏开发者.
内容 硬件开发
pico-8是所谓的梦幻主机, 也就是为8bit游戏开发者屏蔽了硬件细节, 让开发者能够集中精力到游戏创作中. 但是硬件其实是提升游戏体验很重要的一部分, 不考虑硬件也就无法提升硬件相关的游戏体验. 所以我准备开发的游戏机在给游戏开发者一个清晰简单的API的同时, 会持续改进硬件部分体验, 弥补pico-8缺失的一环.
我准备将硬件开发分为5个阶段, 面包板阶段, hack阶段, 原型阶段, 测试改进阶段, 量产阶段.
在面包板阶段, 我会在面包板上对相关功能模块进行开发测试.
在hack阶段, 我会选择一款量产游戏机进行改装, 用pico替换量产游戏机的cpu.
在原型阶段, 我会进行打样, 完成硬件设计的原型
在测试改进阶段, 我会对原型进行测试和改进
在量产阶段, 物料采购, 选择工厂进行生产.
面包板和hack阶段我会同时开始.
这个是我提前买的一个超便宜的量产fc游戏机:
我会对它进行hack, 拆解, 然后将pico塞进去, 由于这个机器很便宜, 所以hack成本比较低.
顺便说明下为什么我选择pico-8作为实现的目标, 而不是nes/fc模拟器的原因:
- fc模拟器很多, 克隆的硬件也很多, 几十块就能买到硬件模拟器, 比如上面我准备hack的就是.
- 我认为nes上面的游戏不开源, 也很难在上面继续开发游戏, 我是不太愿意去移植一块砖头的.
硬件开发的时候我会参考硬禾学堂推荐的开源游戏机openhandheld-mx:
https://www.eetree.cn/project/detail/6
里面的简单的电路会进行复用, 节省开发时间.
软件开发
软件开发分为下面几个阶段:
- lua移植
- 通过pio初步优化视频和音频效率
- 开发测试游戏, 比如贪吃蛇
- 开发测试用例, 用来测试pico-8 api兼容性
- pico-8 api实现, 也就是游戏引擎
其中lua移植由于lua是个小语言, 使用标准c实现, 所以应该不会遇到难题. 利用pio优化可能会花费大量时间, 所以实现初步优化即可. pico-8 api实现可能会花费大量时间, 另外游戏引擎的指令实现可能会遇到问题.
框图
计划
- 移植Lua脚本引擎到pico
- 使用Lua驱动音频speaker
- 使用Lua驱动显示SPI显示屏
- 在驱动的过程中发现性能可优化点, 尝试使用PIO提升性能.
- 挑选并实现典型的pico-8 api
- 实现贪吃蛇游戏
- 继续实现pico-8 api
- 读取pico-8卡带
- 运行celeste游戏
进度
pico板子已到货.