MuMu 模拟器游戏技术适配参考手册
前言
MuMu 模拟器是将安卓应用运行在 PC 上的安卓模拟器软件,可以为安卓手游项目提供 PC 版服务。目前模拟器支持绝大多数游戏的即装即运行,并提供流畅体验和键鼠操作。由于模拟器产品定位和架构的特殊性,为达到游戏原生开发的 PC 客户端的体验,通常还需要游戏方和模拟器进行技术深度合作,针对模拟器进行专项适配。
目前MuMu模拟器已经和《命运:群星》、《阴阳师》、《梦幻西游》、《影之诗》、《哈利波特:魔法觉醒》、《明日之后》、《阴阳师》、《倩女幽魂》、《幻塔》、《天龙八部2:飞龙战天》 等数百款项目进行了技术对接。本手册整理了适配过程中的相关经验,旨在为有意接入 MuMu 模拟器的游戏方提供技术向优化思路和适配工作方向。
根据 已有实践,本手册中提到的措施能够快速且有效地提高游戏运行体验,成本较低,可控;同时也可以降低我们针对游戏进行进一步优化的难度。
本手册供游戏技术开发、游戏引擎技术和模拟器技术人员查阅,诚邀有意接入的游戏开发方认真考虑其中的各项建议。在适配过程中有任何疑问,欢迎联系我们配合处理和技术联调。
文档中所说『我们』指的是 MuMu 模拟器开发组。
目前 MuMu 模拟器提供 Windows x86、macOS (Apple Silicon)、Windows ARM 三条产品线。如无特殊说明,文中内容三条产品线均适用。对于适用于 macOS 和 Windows ARM 版本的特殊说明单独列出。
本文按如下及部分组织:
- 技术对接点和常见问题:接入过程需要考虑的点和常见问题
- 模拟器调试方法:接入过程的调试方法介绍
- MuMuPlatformSDK:模拟器提供的用于辅助接入的独家私有接口
一、技术对接点和常见问题
1. 基础
1.1 x86_64 架构包
目前大部分安卓应用均以 arm32/arm64 架构包为主。arm 代码在模拟器上运行时,会被翻译为 x86 代码执行,产生的性能损失;特别是针对 SIMD 等特殊指令,可能产生较为显著的性能损失。同时,翻译后的 arm 代码还存在运行时稳定性较低,调试难度高等问题。因此强烈建议提供 x86_64 架构的游戏包体。
模拟器在一定程度上支持混合架构包体,即部分库为 arm 架构,部分库为 x86_64 架构。推荐游戏方至少保证游戏引擎和游戏逻辑代码为 x86_64 代码。若跨架构加载库失败,可以联系我们进行处理。
游戏方可以为模拟器提供单独的 x86_64 库的 apk 发行包,或者提供带 x86_64 库和 arm64 库的混合 apk(包体会略微增大)。模拟器会优先使用 x86_64 架构。
请谨慎考虑使用 x86(32 位)架构,32 位程序较少的地址空间可能带来的兼容问题,尽量提供 x86_64 架构。
MuMu 模拟器也支持在 Mac 和 Window On ARM 平台下运行,在这两个平台下因本身支持 arm64 架构,不走底层架构翻译机制,x86_64 架构反而无法运行,所以提供 arm64 架构游戏包体即可。
[macOS] 不需要考虑 x86_64 架构包
[Windows ARM] 不需要考虑 x86_64 架构包
1.2 扫码支付
默认情况下,模拟器内不会预装微信、支付宝等常用带支付功能软件。为方便用户对游戏内购项目进行支付,保障支付流程顺畅,我们建议游戏适配微信、支付宝的扫码支付功能。在检测到模拟器环境时,在支付页面提供扫码支付方式。
微信扫码支付可参考以下页面相关内容:
支付宝扫码支付可参考以下页面相关内容:
2. 图形
2.1 模拟器多渲染模式与图形 API
在 Android 平台,游戏和应用通常使用 OpenGL ES 或者 Vulkan 完成 3D 渲染。
对于 OpenGL ES,模拟器 提供了两种渲染模式:
- Vulkan 渲染模式:将应用的 gles 指令翻译为 vulkan 执行,在大部分用户环境下提供 OpenGL ES 3.2 的接口,包含 Android AEP。
- Direct3D 渲染模式:将应用的 gles 指令翻译为 dx11/dx9 执行,在大部分用户环境下提供 OpenGL ES 3.1 接口,包含部分 Android AEP。这是一种兼容模式,用于支持较低端的用户环境。
用户可以在模拟器设置中选择使用 Vulkan 渲染模式还是 Direct3D 渲染模式,默认为 Vulkan 渲染模式。
两个渲染模式下的图形特性,包括扩展支持、纹理支持、各种实现相关的参数(GL_MAX_xxx)、Program Binary Format 均可能不同。如果引擎持久化相关数据,则切换渲染模式可能导致渲染异常或闪退等问题,需要清理游戏数据。如果切换渲染模式遇到问题,可先自查此原因。
对于 Vulkan,模拟器目前提供 Vulkan 1.1 的接口支持,目前我们通过白名单的方式对游戏开启 Vulkan 支持,只有白名单中的游戏可以成功创建 vulkan device(通过 vkCreateDevice)。
这里请注意区分 Vulkan 渲染模式和 Vulkan API,前者是利用 Vulkan 为应用提供 OpenGL ES API,后者是为应用提供 Vulkan API。
[macOS] 只提供 OpenGL ES 翻译模式,为 Metal 模式。同时支持 Vulkan 1.1
[Windows ARM] 不支持 Vulkan
2.2 游戏默认画质选项
目前默认模拟 GPU 型号为 “Adreno (TM) 640”,但实际用户机配置多种多样。同时,用户可以自由设置该型号。
模拟器的 Android 机型、屏幕分辨率、DPI、屏幕刷新率等均可以由用户设置。但我们会根据用户的宿主机情况,对这些参数提供较为合理的默认设置。
游戏可以通过 Android 系统接口,获取屏幕分辨率、DPI、屏幕刷新率等信息,为用户提供一个合适的默认画质。
根据一般经验,大部分用户运行模拟器时 GPU 算力富余,GPU 算力成为性能瓶颈的情况较少,建议默认提供次高级或最高级画质。如游戏已有 PC 版经验,建议沿用 PC 版画质选择逻辑。
如游戏希望针对不同的宿主机情况,进行推荐画质选项的细致调整,可考虑使用 MuMuPlatformSDK。
2.3 默认场景分辨率(RenderTarget 画布大小)
虽然大部分用户 PC 显示器分辨率较低,但用户可以自由设置安卓的分辨率达到 2K 或者 4K。用户设置的分辨率可通过 Android 系统接口获得。
游戏可以通过提供 Native分 辨率(即游戏场景的分辨率等于安卓的分辨率),配合高清纹理,可以达到 SSAA 的效果,大幅提升画面表现。建议考虑在最高级画质等级下提供 Native 分辨率、2K/4K 分辨率。
同样的,如游戏希望针对不同的宿主机情况,进行默认场景分辨率的细致调整,可考虑使用 MuMuPlatformSDK。
2.4 纹理精度
部分游戏会准备大小两套纹理,并根据设备分辨率进行选择。大部分用户 PC 的分辨率不高,以 720P/1080P 为主,但高清纹理对游戏画面提升也较为明显。建议考虑在默认画质及以上的画质等级下使用高清纹理。
同样的,也可以考虑使用 MuMuPlatformSDK,针对不同的宿主机情况进行选择。
2.5 OpenGL ES多线程渲染
有些游戏使用多线程渲染模式,通常是分为资源加载线程和渲染线程。但模拟器上的图形指令在处理流程后半段会被串行化,执行的并发度较低。因此,多线程渲染模式的效果取决于在应用层(App 内部)执行时的并发程度。根据经验,建议维持游戏原有逻辑不做特定适配。如有特定需求,具体情况可以联系我们分析联调。
2.6 Shader 编译和 Program Binary
推荐尽量将编译操作安排在加载时执行,Program Binary 的使用谨慎反对,不推荐使用。
3. 输入和控制
MuMu 模拟器的输入和控制大体上分为两个模式:映射模式和穿透模式。
- 映射模式下,用户操作模拟在真机上的触摸操作,将用户的键盘按键、鼠标点击等操作映射成屏幕上相应坐标的触摸操作。模拟器运营会为游戏配置特定的键鼠、手柄云方案供玩家使用。游戏要处理的是 touch down、touch up、touch move 等事件。
- 穿透模式下,模拟器将键盘、鼠标、手柄等外设直接穿透至 Android 系统,即为安卓系统连接了相应的外设。只要游戏适配了物理外设,即适配了 MuMu 的键鼠穿透,可以重点看引擎关于这一块的文档。
我们强烈建议游戏对键盘与鼠标输入进行适配,可实现显著的体验增强。游戏接入请参照相关游戏引擎的说明。
- 此部分如有接入需求,请联系 MuMu 模拟器商务沟通后获取完整版本;
4. 性能
4.1 开放高帧率
模拟器的 vsync 信号频率是模拟的,在模拟器设置中可以开启高帧率模式,提供最高达 240HZ 的 vsync 信号,用户设置的 vsync 信号频率可通过 Android 系统接口查询。
游戏玩家对帧率要求很高,且 PC 平台无需考虑耗电与发热,建议根据玩家设置,在游戏中提供超过60帧的选项,如 90 帧或 120 帧,以便电竞屏用户体验更高帧率。另外,推荐游戏将帧率的默认设置提升至等同于 vsync 信号频率,以给玩家提供最流畅的体验。
4.2 其他性能优化项
glGetError 相关、压缩纹理格式、磁盘 I/O 也存在相关优化方法,具体情况可以联系我们分析联调,我们可以尝试给出相关优化方案。