遥想当年, 真新镇的小智一句 ”我得到神奇宝贝了(ポケモン ゲットだ)!” 吸引了不知全世界多少中小学生们纷纷踏足宝可梦(Pokémon, 台译: 神奇宝贝, 港译: 宠物小精灵, 大陆: 宝可梦)的神奇世界.
从动画周边到主机游戏, 宝可梦这一IP(原作: 田尻智)为任天堂吸金无数. 时至今日仍活跃在各大影院一线, 掌机热销榜单之上. 系列粉丝们不论是亚洲人还是欧美人, 不论是Z世代的少男少女还是充当社会中流砥柱的社员社畜, 无不为这一纷繁欢乐的宝可梦世界保持着十分的好奇与兴奋.
上图是笔者于2019年10月到访伦敦的宝可梦中心开业活动(Pokémon Center London Meetup)[1] 是所拍. 时值任天堂 Switch 平台上”宝可梦-剑盾”的预热时分, 原定于中午开办的活动笔者在秋风萧瑟的早上9点钟到达时就已经是人山人海, 队伍中不断有各色人士纷至沓来, 足见这一IP对广大青年的吸引力.
今天这篇文章是 <<云芯一号 云游戏服务器企划>> 的第二篇文章, 本文中我们将借助宝可梦这一贯穿任天堂所有平台的游戏系列作为引例, 对包括 任天堂 NDS, GBA, FC/NES 红白机(小霸王), 街机(游戏机厅) 和 PSP 等门类的主机游戏的模拟展开探讨, 以期借助云芯一号这一强大的多媒体服务平台填补少时未曾补完的主机梦.
前置要求
各主机及模拟平台综述
1 - PSP
遥想儿时, 最梦想得到的游戏机就是 PSP 2000. 看着富有的同学拿着它, 又能玩游戏又能当 MP4 使用, 心里别提那份羡慕与嫉妒了. 因此着手本文时, 第一想到的也是 PSP 平台的模拟. 奈何正如徐珂靖在其文章中所说, 即便是最先进的模拟平台 PPSSPP [2], 基于目前的驱动(驱动的进一步探讨见本文最后一节-展望), 云芯一号也只能运行在十几帧, 还达不到30帧的满帧. 如果想流畅游玩, 则需要开启跳帧功能.
(虽然有人在 Github 上提出针对 rk3399 平台在编译 PPSSPP 时使用只开启大核心关闭小核心来提升帧率的方法[3], 但是个人实测以后并不管用.)
2 - NDS
话说回来, 儿时虽然羡慕别人家的孩子有 PSP 玩, 但是自己也深知昂贵的价格下家里是无论如何也不可能给买. 当时心里的算盘是自己退而求其次, 不要三四千一台的 PSP, 改要一两千一台的 NDS. 当然, 不用想也知道最终结局只能是被断然回绝. 于是乎, 寒暑假里除了与小伙伴们玩网游联机, 自己玩的最多的就是使用家里那台 奔腾4 电脑模拟 NDS 游玩各种游戏圆梦. 玩的最多的游戏是三个, <<宝可梦-黑>>, <<游戏王 GX>> 和 <<牧场物语-风之集市>>.
当下流行的 NDS 开源模拟器主要有两个, 即 DeSmuMe 和 NooDS . 笔者曾使用过 RetroArch (下文详述)中集成的 DeSmuMe , 奈何同样受限于显示驱动性能类似于上述 PPSSPP 的性能, 只能跑到十几帧. 而后者 NooDS , 号称最速 DS 模拟平台. 实测借助 NooDS 的力量, 云芯一号可以满帧(30FPS)运行 NDS 游戏, 流畅不卡! 从而我们为 NDS 平台的模拟找到了一个完美的方案.
3 - RetroArch
当下社会我们有着纷繁的主机平台和纷繁的游戏类型, 这就意味着需要各式各样的模拟器来运行各式各样的游戏, 可谓是麻烦至极. 自然就有人像爱因斯坦毕生所追求的”统一场论”一样致力于打造一个全平台模拟器. 于是, 我们就有了 RetroArch, Lakka, EmulationStation 等全平台全能型模拟器. 不出意外, 他们也都提供了 PSP 和 NDS 的模型功能, 但是毕竟是全能型选手, 因此不能照顾过多的细节和进行专门的平台优化, 他们所带的 NDS 和 PSP 模型性能同样不是最优的, 因此无法在云芯一号上满帧运行.
话虽如此, 但是他们提供的一体化方案却十分适用于模拟一些对性能要求不高的平台, 如笔者唯二拥有的 GBA 和 小霸王(日: FC/欧美: NES/俗称: 红白机) 平台. 如此, 我们不必在费心费力地去寻找解决方案, 使用这种模拟平台便可找到最优解. 这里我们选用的是 RetroArch 来模拟 GBA 和 小霸王, 主要原因是我们的 Ubuntu 系统下提供编译好的二进制安装, 直接 apt install 即可, 开箱即用堪称完美.
4 - 街机
值得注意的是, 除了 GBA 和 小霸王平台, RetroArch 还可以模拟街机. 在小时候没怎么去过几次却留下深刻印象的街机厅里(以及那时候电视上的点播台, 云游戏的鼻祖), <<吞食天地>>, <<合金弹头>>, <<恐龙快打>>, <<圆桌骑士>>, <<拳皇97>>, 华丽的招式, 动感的音效, 密集的按键声给我的心里埋下了悸动的种子.
此外, 小时候国内不常见却在欧美和日本极为盛行的 超级任天堂(SNes), 雅达利(Atari), 3DS, PS1, PS2, 世嘉土星, Wii, N64, 奥德赛 等诸多平台都提供了模拟支持, 不可谓不良心满满.
现在, 闲话少叙, 让我们正式开启云芯一号的模拟追忆之旅.
NooDS 模拟任天堂 NDS 游戏机
1 - 编译 NooDS
NooDS 的编译非常简单, 只需要安装以下包:
sudo apt install libwxgtk3.0-dev portaudio19-dev然后在 NooDS 目录下运行 make 即可.
编译完后的可执行文件就在 NooDS 目录下.
2 - BIOS 与 游戏Rom
需要注意的是, NooDS 没有集成 NDS 游戏机的 BIOS 文件, 因此需要去网上自行下载一个, 并放在 NooDS 目录下面.
(注意: BIOS文件包含 nds_firmware.bin, nds_bios_arm9.bin 和 nds_bios_arm7.bin 三个文件)
Rom 文件即游戏文件, 在放好 BIOS 之后便可随意打开 NDS 的 游戏Rom 文件进行游玩了.
(注意: 在 NooDS 主界面的设置菜单选项中将 Thread 3D 设置为最高可充分释放性能)
以下图片是在 云芯一号 上运行 <<牧场物语风之集市>>, <<游戏王 GX>> 和 <<宝可梦-黑>> 的实机画面.
因为 NDS 有上下两个屏幕, 所以模拟器界面也是每个游戏有上下两个画面.
RetroArch 模拟 GBA, 红白机 和 街机平台
由于 Ubuntu 提供编译好的二进制文件, 因此 RetroArch 的安装十分简单:
sudo add-apt-repository ppa:libretro/stable
sudo apt-get update
sudo apt-get install retroarch libretro-*需要注意的是在运行 RetroArch 时有可能需要 root 权限. 如果在普通权限下可能会出现读取不到显卡驱动的问题.
RetroArch 之所以能够实现模拟不同的主机类型和游戏, 是因为用到了不同类型的 Core (主机内核). 前面我们使用 apt 安装的 libretro-* 就是安装各式各样的 Cores.
在使用 RetroArch 时首先应该载入游戏相对应的内核(比如模拟 GBA 游戏就载入 GBA 内核), 我们通过 apt 安装的内核在 /usr/lib/aarch64-linux-gnu/libretro 文件夹下, 需要定位到该文件夹下载入内核. 然后再打开游戏文件.
内核名称与游戏主机平台的对应关系如下:
vbam_libretro.so - GBA 内核
nestopia_libretro.so - 红白机(NES/FC/小霸王)内核
fbalpha_libretro.so - 街机 内核* 关于手柄/摇杆: 我们知道尤其是街机游戏, 使用摇杆能够显著提升游玩的打击感. 可喜的是 Linux 普遍自带相关的驱动, 从而我们的云芯一号做到了游戏手柄的即插即用.
以下为云芯一号实机模拟 GBA 和 红白机 经典游戏的截图画面 (使用 RetroArch 的 F8 键截图功能导出).
游戏依次是:
GBA 游戏 <<宝可梦红宝石>>, <<光明之魂2>>
红白机游戏 <<魂斗罗>>, <<赤色要塞>>
街机游戏的模拟相较于 GBA 和 红白机 稍显复杂. 但是只需要记住一点, 即: Rom 和 BIOS 二者必须配套. 由于我们 RetroArch 使用的是最新的街机模拟内核 fbalpha_libretro.so, 因此单独从网上下载来的 游戏Rom 是不可以使用的, 必须配套合适的 BIOS文件. 如何找到这些配套的资源就需要仰仗这个网站了:
https://www.planetemu.net/roms/fb-alpha这里以 拳皇97 为例, 首先需要到网站上下载 游戏Rom. 因为拳皇的英文名是 The King of Fighters 97, 而且网页是按照字母索引的, 因此我们需要点选 T.
找到拳皇的 游戏Rom 并打开页面后我们就发现有个游玩指南(下图), 网页说到模拟街机游戏除了需要 游戏Rom(例如下图 kof97.zip) 还需要配套的 街机BIOS文件(例如下图 neogeo.zip).
我们都知道街机厅的机台一般只有一种或几种游戏, 这是因为街机游戏是基于 基板 系统的, 可以类比如电脑主板. 不同公司开发的街机游戏皆是基于不同的基板而打造. 拳皇97是基于日本SNK公司出的 Neo Geo基板 系统, 因此就如图中所示还需要找到 索引N 中下载一个 NeoGeo 的 BIOS文件 (即下图中的 neogeo.zip). 准备好这两者以后, 一齐放在同一个文件夹下面, 再使用 RetroArch 打开 游戏Rom 即可 (注意 游戏Rom 和 街机基板BIOS 都是ZIP格式, 不需要解压)
由于平台本身需求不是很高, 配合 rk3399 的性能, 全部 GBA, 红白机 和 街机游戏 在云芯一号上都可以 满帧 全速运行.
街机平台上的 <<拳皇97>> 和 <<合金弹头2>> 在我们的云芯一号的实机运行画面见下图:
PPSSPP 模拟索尼 PSP 游戏机
如开头所述, PPSSPP 是目前最为主流也最为成功的 PSP 模拟器. 但是受限于显示驱动, 我们的 rk3399 的 T860MP4显示芯片 并不能发挥出全部实力, 以至于大部分 3D游戏 都运行在 50% 的帧率状态下(2D游戏能够满帧).
这里将 PSP 的模拟不能满帧归罪于显示驱动的说法并不是空穴来风. 已有的开源主机平台如 ODroid N1 使用的就是我们云芯一号的 rk3399 方案, 而其升级版 ODroid N2 则使用的是 晶晨S922x 方案, 后者的GPU官方宣称性能 仅仅 比 rk3399方案强 10% [4], 但是只是强这 10% 却可以在 PPSSPP 上跑满帧 60帧! [5]
因此驱动问题是最大的瓶颈, 而且我们也有理由怀疑 Odroid 官方也可能是无力解决第一代产品的驱动问题而升级为性能提升不大的晶晨方案.
目前来看, 为了流畅游玩 PSP游戏, 我们需要在 PPSSPP模拟器 上开启 1倍跳帧 或 自动跳帧. 让模拟器每模拟一帧就抛弃一帧, 保证游戏的实时性和流畅性而不至于卡成慢动作. 如果大家想体验可以按照如下方法安装与配置. 这里主要参照了徐珂靖的相关公众号文章 [6].
1 - 编译 PPSSPP
我们使用如下命令编译安装最新版本的 PPSSPP:
git clone --recurse-submodules https://github.com/hrydgard/ppsspp.git
sudo apt install build-essential cmake libgl1-mesa-dev libsdl2-dev libzip-dev(可选) Clang 编译速度更快一些, 如果选择使用 Clang 而不是默认的 GCC 进行编译, 可以使用如下命令安装并配置 Clang 为默认编译器:
sudo apt install clang
sudo update-alternatives --config cc
sudo update-alternatives --config c++使用 GCC 编译的话请在 PPSSPP 目录下运行如下命令:
./b.sh --release使用 Clang 编译的话则请使用如下命令:
./b.sh --release --clang2 - 配置并运行 PPSSPP
PPSSPP 默认的界面是英文, 在 System 选项中可以打开中文支持.
为使我们的云芯一号在目前水平有限的驱动软件下流畅游玩, 我们需要开启 1倍跳帧 或 自动跳帧 选项.
下图为实机运行<<刺客信条-血缘>>的游戏画面, 截图时帧率为 11, 平均帧率在 14 左右, 开启 1倍跳帧 后等效为 28 帧的游戏画面, 实际体验基本流畅可以接受.
展望
目前来看, 影响云芯一号多媒体算力的最大阻碍在于 GPU驱动, 奈何这可能不是短期内能够解决的问题, 因为驱动的更新依赖 SoC 厂商也就是 瑞芯微(Rockchip) 的步伐.
随着新一代图形API Vulkan 步入历史舞台, 越来越多的模拟器平台 (如 PPSSPP) 都已经支持或宣布了支持计划. 使用 Vulkan API 将全面释放云芯一号的算力潜能.
而就目前来看, 虽然 Github 上已经有不少人反应要求瑞芯微官方更新 Vulkan驱动, 甚至最早的一条更是在 2017年7月 就有人提出[7], 但是三年过去了, 官方的答复仍然是只有安卓支持, Linux平台由于相应驱动本身的采购价格昂贵不予考虑.
有没有其他的可能呢? 答案是有的. 我们除了继续等待 瑞芯微 的官方支持以外, 新的 Linux 内核版本(5.4以上)由于集成了开源 mali 驱动, 配合用户端的 panfrost 开源驱动 (对Vulkan的支持正在进行中[8]), 云芯一号发挥其全部图形性能的未来尤为可期!
参考文献
[1]宝可梦中心 伦敦粉丝见面会 https://www.meetup.com/NX-Lon...
[2] PPSSPP官方网站 https://www.ppsspp.org/
[3] 在RK3399 编译 PPSSPP 时开启大核心关闭小核心 https://github.com/hrydgard/p...
[4] ODROID - N2商店 https://www.hardkernel.com/sh...
[5] ODROID - N2 满帧模拟PSP游戏视频 https://www.youtube.com/watch...
[6] 极客小电脑Jetson Nano评测 https://mp.weixin.qq.com/s/d3...
[7] 最早要求更新rk3399的GitHub帖子 https://github.com/rockchip-l...
[8] Panfrost 逐步完善对 Mali 设备的驱动支持 https://www.gamingonlinux.com...