设计概述¶
现代游戏主机需要强大的算力才能被准确模拟。因此,该模拟器采用一种称为 HLE(High-Level-Emulation,高级模拟)的方法。简而言之:与其精确模拟构成某个组件的每一个子系统,不如模拟最终可见的 I/O 接口。
例如,对于磁盘写入,我们不模拟真正的 SD 卡,而是使用 C++ 标准库进行 I/O。此外,我们利用 fs 服务提供的抽象来“欺骗”程序,使其相信某些 SD 卡属性是真实的。这尤其包括为虚拟 SD 卡编造大小、为给定存储卡提供“合理”的数值或预期输出,等等。模拟器也不会写入实际 SD 卡,而只是写入一个文件。
这也意味着模拟器的很大一部分工作只是使用 HLE 原语重新实现固件;例如,音频不会进入模拟音频设备,而是由专用服务即时处理,然后传给 SDL3/cubeb 等。
因此,许多已实现的系统并非与原版软件 100% 精确一致,但已经“足够好”到能够以假乱真。虽然我们确实努力保持高兼容性(尤其是对自制软件),但这些方法存在现实局限。
尚未对整个模拟器进行正式的模糊测试或形式化验证,这意味着每个子系统中都可能隐藏着数百个 bug。因此,输出也可能因上述问题而无法正确匹配。
src/android/¶
整个 Android 前端,主要用 Kotlin 编写,并且由于 Android 做事的方式特别糟糕(也特别另类),通常包含一些荒唐的 hack。
src/audio_core/¶
处理所有与音频相关的内容,大部分滤波和处理都在这里完成(CPU 密集型任务!)。
src/common/¶
common 文件夹只包含一些用于补全缺失功能的简单 polyfill。我们强烈鼓励新 PR 使用现有依赖或 C++ 标准库。尽量减少我们重复造轮子的地方总是一件好事。
src/core/¶
core 文件夹 是模拟器的主要核心。虽然我们不官方支持开箱即用地适配其他前端(例如 RetroArch),但任何潜在的开发者都可以复用这个库(由 CMake 编译成库)来构建他们自己的 RetroArch core。
src/dynarmic/¶
参见 Dynarmic。
src/hid_core/¶
输入、摇杆、控制器以及所有与输入设备相关的内容。
src/shader_recompiler/¶
专用着色器重编译器,用于将 Maxwell 汇编代码转换为 SPIR-V、GLSL 或 GLASM。
src/video_core/¶
这里的大部分内容都有各自的专门章节。简而言之,这基本上就是完整的 Tegra NVIDIA Maxwell GPU 模拟。此外,它还包括一些额外效果,用于模拟 MSAA、D24 拷贝或作为 polyfill。
可用的后端有:Null、Vulkan 和 OpenGL。
参见 NVIDIA GPU。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 eg/Eglantine