Skip to main content
Version: v4

MuMu 模拟器游戏技术适配参考手册

前言

MuMu 模拟器是将安卓应用运行在 PC 上的安卓模拟器软件,可以为安卓手游项目提供 PC 版服务。目前模拟器支持绝大多数游戏的即装即运行,并提供流畅体验和键鼠操作。由于模拟器产品定位和架构的特殊性,为达到游戏原生开发的 PC 客户端的体验,通常还需要游戏方和模拟器进行技术深度合作,针对模拟器进行专项适配。

目前MuMu模拟器已经和《命运:群星》、《阴阳师》、《梦幻西游》、《影之诗》、《哈利波特:魔法觉醒》、《明日之后》、《阴阳师》、《倩女幽魂》、《幻塔》、《天龙八部2:飞龙战天》 等数百款项目进行了技术对接。本手册整理了适配过程中的相关经验,旨在为有意接入 MuMu 模拟器的游戏方提供技术向优化思路和适配工作方向。

根据已有实践,本手册中提到的措施能够快速且有效地提高游戏运行体验,成本较低,可控;同时也可以降低我们针对游戏进行进一步优化的难度。

本手册供游戏技术开发、游戏引擎技术和模拟器技术人员查阅,诚邀有意接入的游戏开发方认真考虑其中的各项建议。在适配过程中有任何疑问,欢迎联系我们配合处理和技术联调。

tip

文档中所说『我们』指的是 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 架构。

tip

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 也存在相关优化方法,具体情况可以联系我们分析联调,我们可以尝试给出相关优化方案。

二、模拟器调试方法

1. ADB连接

可以通过 adb 接入模拟器进行调试,具体方法:

Windows:https://mumu.163.com/help/20240807/40912_1073151.html

​Mac:​https://mumu.163.com/mac/tutorials/connect-adb.html

如果开启了桥接模式,需要按以下方法进行 adb 调试:

https://mumu.163.com/help/20240807/40912_1164744.html

如果想进行跨机器进行 adb 调试,可以使用远程调试的方式,可参考以下链接:

https://mumu.163.com/help/20240902/40912_1178199.html

通过 adb 开启 root 权限,具体方法:

终端执行:adb -s 127.0.0.1:xxxx root

一些adb使用异常的场景,可以参考以下链接尝试处理:

https://mumu.163.com/help/20240807/40912_1144608.html

2. Android Studio Attach

模拟器支持所有架构的应用使用 Android Studio 进行 Attach 操作。

3. 动态调试

模拟器只支持 x86/x86_64 架构的代码进行调试和断点(armeabi-v7a、arm64-v8a 不支持),建议游戏使用 x86/x86_64 架构来开发 PC 版,能更快更好地定位问题。

以下内容我们可以提供相关能力,具体教程可以联系我们后沟通获取;

  1. OpenGL ES 游戏的 GPU 抓帧
  2. Vulkan游 戏的 GPU 抓帧
  3. 确定应用当前运行架构
  4. 查看指定 so 的架构(使用 adb 命令)
  5. 手工指定运行架构
  6. 映射游戏端口到主机上(Hunter/Profile 的使用)
  7. 图形指令 Dump
  8. 图形 Profiling
  9. Vulkan游戏测试

三、MuMuPlatformSDK

MuMu 模拟器提供了一套面向游戏开发者、引擎开发的独家接口,可用于针对 MuMu 模拟器的适配、检查、调优过程。MuMuPlatformSDK 中的大部分接口随 MuMu 版本同步发布,可直接通过反射进行调用。本文档仅介绍 SDK 接口能力,如有合作意向请联系 MuMu 模拟器商务进行获取。

注意:MuMuPlatformSDK 和 MuMu 联运 SDK 不同,后者为 MuMu 渠道商业化合作需要接入的 SDK,具体可联系 MuMu 模拟器商务对接。

1. callHost 接口 ​

该接口主要用来方便游戏接入各种反外挂软件。这些反外挂软件都有对应的 windows 平台实现,游戏应用无法直接接入其 windows 平台的实现,mumu 模拟器给游戏应用提供了一个接口,该接口可以给游戏应用接入 windows 端的反外挂软件实现,具体的反外挂 API 的应用需要参考对应的文档。

2. 安全性功能接口 ​

MuMu 模拟器发展过程中,开发了很多方便玩家运行游戏的功能,典型的如:应用多开,模拟器多开,同步器,操作录制等。这些功能在方便了玩家运行游戏的同时,也给游戏运营方带来了一些困扰,因为会有些工作室玩家使用这些功能进行刷号,这种行为同时也损害了其他玩家的权益。

基于此,且为进一步提高外部合作游戏接入 MuMu 模拟器的可定制化要求,我们还开发了一些接口来得到模拟器部分功能的运行状态,并可以按需将这些模拟器功能进行禁止来满足游戏运营要求。

目前,游戏通过安全性功能接口可以知道模拟器的 root 开关情况,以及同步器、操作录制功能的开关情况。

3. MuMu 模拟器检测 ​

可以通过以下方式之一进行 MuMu 模拟器的运行时识别:

-通过读取系统属性 ro.build.id,该参数需求联系相关对接同学获取

-如果游戏接入了 UniSDK,可以使用 UniSDK 中的 isMuMu 函数判断。具体方法请参考 UniSDK 相关文档。

-同时我们提供了一个轻量级 sdk 专用于识别 MuMu。可以联系我们单独获取,并获得接入的相关指引。

  • 需要注意,前两种方式为简单的识别方案,有可能被其他 Android 环境(如其他品牌模拟器、云手机、云游戏)轻易伪造。如有较强的 MuMu 模拟器识别需求,建议使用第三种方式。
  • 对于本文所述的相关适配,我们无法保证其他 Android 平台的有效性,推荐仅在 MuMu 模拟器上生效。

4. 获取模拟器运行时的硬件设备信息

为方便游戏获取模拟器运行平台的硬件设备信息,我们开发定制了获取硬件信息的接口,该接口可获取 MuMu 模拟器所在电脑的一些常见信息,包括 CPU 型号及基准频率,显卡等信息。游戏可以通过该接口,根据玩家硬件信息进行默认画质等的推荐设置,提升用户体验。

四、常见问题 FAQ

文件管理器无法显示在共享文件夹里的新增文件 ​

在 PC 端的共享文件夹放入文件后,需要点击模拟器中文件管理器右上角的图标,然后点击刷新才能显示新增文件。

x86和x86_64 架构的区别 ​

性能上差别不大(看引擎自身优化),主要区别是可用内存(32 位的可用 Native Memory 是 4G 左右,64 位的是 256TB (48 位地址空间))。

文件管理器无法删除 Sdcard 的一些文件

模拟器自带的文件管理器没有 Root 权限,请前往应用中心下载《RE 文件管理器》并开启模拟器 Root 功能后进行删除。

模拟器里游戏可以使用 DX 渲染吗 ​

模拟器的 DX 模式指的是将 OpenGL ES 翻译为 DX(Vulkan 模式为将 OpenGL ES 翻译为 Vulkan)。对于游戏来讲都只能看到 OpenGL ES 接口。

具体可参见“图形-模拟器多渲染模式与图形 API”一节。

可以知道当前 OpenGL ES 的翻译模式吗?

模拟器目前不提供模式查询信息。建议游戏引擎直接查询 OpenGL ES 的相关支持,做好不同特性的兼容。

在模拟器上如何获取模拟器的渠道号?

通过读取系统属性 nemud.player_product 进行获取。