常见问题
评估
要把游戏包发给你们吗?
要一个能跑的代表性包,光看接口名判断不了。法务在意就先签 NDA,或先发一个剥皮版 (去美术、留逻辑)。
真机数据覆盖到哪一步?
三款游戏 (PixiJS / Phaser / 原生 Canvas) 在 Mate 30 Pro 上各跑 3 遍,见 性能页; 一致性套件三端共 80 条共有断言全过。原始数据在 migo-bench。
接下来会补上哪些证据?
- 低端机对照在做现有数字都来自 Mate 30 Pro。补红米 A 档入门机,同套 harness。
- 真机同帧录像在做Migo 与 WebView 同机同游戏,一镜到底,画面叠加 PSS / CPU。
- 跨 OEM 一致性在做补小米 / OPPO / vivo 各一行。
- 接口检索页在做369 个接口独立成页,搜名字直接到答案。
- 英文站在做东南亚与中东客户需要。
接入
我的包是按小游戏 target 打的,能直接运行吗?
能,这是主路径。装 migo-wx-adapter 后 wx.* 调用原样保留。Cocos / Egret / Laya 小游戏导出即载入;Unity 走 WebGL 导出再转小游戏 target。浏览器 target 走 migo-web-adapter。清单外调用返回错误码,不静默失败。
装上 web 适配层之后,浏览器接口的行为有哪些差异?
装了 migo-web-adapter 后,浏览器名字 → 运行时函数的映射:
- document.createElement
document.getElementById没有可用适配层建一棵最小元素树,深度刚好够引擎的启动代码不抛错。getElementById("GameCanvas") 会拿到那块真画布。 - document.querySelector
getElementsByTagName没有返回 null / 空数组不做 CSS 选择器匹配,也不解析 HTML。引擎若依赖选择器查找元素,此处需要适配。 - getComputedStyle
CSSStyleDeclaration没有仍然没有不跑布局引擎。游戏内的界面由游戏自己画在画布上。 - addEventListeneronTouchStart()可用适配层把触摸、键盘、手柄转成 DOM 风格事件再派发。
- new Image()
XMLHttpRequestcreateImage()
request()可用引擎自带资源加载器原样跑。不支持 CORS、cookie、响应流、Blob 与 FormData。 - fetchrequest()仍然没有网络走宿主通道,域名白名单与证书策略可控。需要 fetch 时自带 polyfill。
- WebSocketconnectSocket()可用长连接也走宿主通道,便于统一超时与重连。
- localStoragesetStorageSync()可用宿主管理,含容量上限与清理策略。缺键返回 null。
- sessionStorage没有仍然没有没有会话概念。短期状态放内存。
- new Worker()createWorker()仍然没有子线程由运行时创建,走 postMessage / onMessage。
- window.innerWidth
devicePixelRatiogetWindowInfo()加载时快照不订阅 resize, 避免与引擎布局缓存打架。旋转后自己读 getWindowInfo()。
我的游戏调用的接口在不在清单里?
接口都挂在 migo.* 下,装 wx-adapter 后 wx.* 是同一批函数。十二组互不重叠:
激励视频、插屏、Banner、格子,四种位型的创建与生命周期
道具购买与支付能力探测,实现交回宿主
登录、用户信息、授权设置与隐私协议入口
排行榜要的第二个 JS 上下文,加一块共享画布
群聊、朋友圈、分享图与转发菜单的成对回调
原生输入法浮层与候选事件,游戏侧不需要 DOM input
首包瘦身、按需加载、资源与 DNS 预取
request、WebSocket、TCP、UDP,全部走宿主通道
触摸、鼠标、滚轮、按键、手柄,每个都可解绑
Toast、弹窗、扫码、客服会话与业务视图,由原生绘制
完整节点图:振荡器、滤波、混响、分析与声道路由
逐帧回调、定时器,以及目标帧率的显式设定
另有 197 个: 画布与图像、音视频录制与直播、设备与系统信息、文件系统、蓝牙与 Beacon、定位、日志与性能上报、Worker、小程序跳转、生命周期。
11 个是桩 (虚线框) — 名字在、调用不报错、但什么也不做。与 data/surface.txt 同源,构建期门禁校验。
AnalyserNodeAudioBufferAudioBufferSourceNodeAudioContextAudioDestinationNodeAudioListenerAudioNodeAudioParamBiquadFilterNodeChannelMergerNodeChannelSplitterNodeConstantSourceNodeDelayNodeDynamicsCompressorNodeFileManagerFloat16ArrayGainNodeIIRFilterNodeImageBitmapInnerAudioContextMediaAudioPlayerOscillatorNodePannerNodePeriodicWaveScriptProcessorNodeTemporalURLWaveShaperNodeWebGL2RenderingContextWebGLRenderingContextaddColorSignaddRecentColorSignalertauthPrivateMessageauthorizecancelAnimationFramecheckIsAddedToMyMiniProgramcheckIsSupportMidasPaymentcheckScenecheckSessioncheckUpdatecheckUserLocationcheckWritePhotosAlbumchooseImagechooseMessageFileclearIntervalclearStorageclearStorageSyncclearTimeoutcloseBLEConnectioncloseBluetoothAdaptercloseSocketcompressImageconfigconnectSocketcreateBLEConnectioncreateBannerAdcreateBufferURLcreateCameracreateCanvascreateCustomAdcreateFeedbackButtoncreateGameBannercreateGameClubButtoncreateGameIconcreateGamePortalcreateGridAdcreateImagecreateImageBitmapcreateImageDatacreateInnerAudioContextcreateInterstitialAdcreateLivePlayercreateLivePushercreateMediaAudioPlayercreatePageManagercreateRewardedVideoAdcreateTCPSocketcreateUDPSocketcreateUserInfoButtoncreateVideocreateVideoDecodercreateWebAudioContextcreateWorkerdecodedefinedownloadFileencodeenverrorexitApplicationexitMiniProgramfetchSecondFloorIconOptionSyncgetAccountInfoSyncgetAppAuthorizeSettinggetAppBaseInfogetAvailableAudioSourcesgetBLEDeviceCharacteristicsgetBLEDeviceRSSIgetBLEDeviceServicesgetBLEMTUgetBatteryInfogetBatteryInfoSyncgetBeaconsgetBluetoothAdapterStategetBluetoothDevicesgetClipboardDatagetConnectedBluetoothDevicesgetDeviceBenchmarkInfogetDeviceInfogetDirectAdStatusSyncgetEnterOptionsSyncgetFileSystemManagergetFriendCloudStoragegetFuzzyLocationgetGameClubDatagetGameLogManagergetGamepadsgetHeapStatisticsgetLaunchOptionsSyncgetLocalIPAddressgetLocationgetLogManagergetMenuButtonBoundingClientRectgetNetworkTypegetOpenDataContextgetPerformancegetPhoneNumbergetPotentialFriendListgetPrivacySettinggetRealtimeLogManagergetRecorderManagergetScreenBrightnessgetSettinggetSharedCanvasgetShowSplashAdStatusgetStoragegetStorageInfogetStorageInfoSyncgetStorageSyncgetSystemInfogetSystemInfoAsyncgetSystemInfoSyncgetSystemSettinggetTextLineHeightgetUpdateManagergetUserCryptoManagergetUserGameLabelgetUserInfogetUserProfilegetWhatsNewSubscriptionsSettinggetWindowInfogetWritePhotosAlbumhideKeyboardhideLoadinghideShareMenuhideToastisBluetoothDevicePairedisColorSignExistSyncloadFontloadSubpackageloginmakeBluetoothPairmodifyFriendInteractiveStoragenavigateBackMiniProgramnavigateToMiniProgramnavigateToScenenotifyBLECharacteristicValueChangeoffAccelerometerChangeoffAddToFavoritesoffAppHideoffAppShowoffAudioInterruptionBeginoffAudioInterruptionEndoffBLECharacteristicValueChangeoffBLEConnectionStateChangeoffBLEMTUChangeoffBeaconServiceChangeoffBeaconUpdateoffBluetoothAdapterStateChangeoffBluetoothDeviceFoundoffCompassChangeoffCompositionEndoffCompositionStartoffCompositionUpdateoffDeviceMotionChangeoffDeviceOrientationChangeoffDirectAdStatusChangeoffErroroffGamepadConnectedoffGamepadDisconnectedoffGyroscopeChangeoffHideoffKeyDownoffKeyUpoffKeyboardCompleteoffKeyboardConfirmoffKeyboardHeightChangeoffKeyboardInputoffMemoryWarningoffMessageoffMouseDownoffMouseMoveoffMouseUpoffNeedPrivacyAuthorizationoffNetworkStatusChangeoffNetworkWeakChangeoffShareAppMessageoffShareMessageToFriendoffShareTimelineoffShowoffSocketCloseoffSocketErroroffSocketMessageoffSocketOpenoffTouchCanceloffTouchEndoffTouchMoveoffTouchStartoffUnhandledRejectionoffUserCaptureScreenoffWheeloffWindowResizeonAccelerometerChangeonAddToFavoritesonAppHideonAppShowonAudioInterruptionBeginonAudioInterruptionEndonBLECharacteristicValueChangeonBLEConnectionStateChangeonBLEMTUChangeonBeaconServiceChangeonBeaconUpdateonBluetoothAdapterStateChangeonBluetoothDeviceFoundonCompassChangeonCompositionEndonCompositionStartonCompositionUpdateonDeviceMotionChangeonDeviceOrientationChangeonDirectAdStatusChangeonErroronGamepadConnectedonGamepadDisconnectedonGyroscopeChangeonHideonKeyDownonKeyUponKeyboardCompleteonKeyboardConfirmonKeyboardHeightChangeonKeyboardInputonMemoryWarningonMessageonMouseDownonMouseMoveonMouseUponNeedPrivacyAuthorizationonNetworkStatusChangeonNetworkWeakChangeonShareAppMessageonShareMessageToFriendonShareTimelineonShowonSocketCloseonSocketErroronSocketMessageonSocketOpenonTouchCancelonTouchEndonTouchMoveonTouchStartonUnhandledRejectiononUserCaptureScreenonWheelonWindowResizeopenAppAuthorizeSettingopenBluetoothAdapteropenBusinessViewopenCustomerServiceConversationopenPageopenPrivacyContractopenSettingopenSystemBluetoothSettingperformancepostMessagepreDownloadSubpackageprefetchAssetsprefetchDnsprefetchImagepreviewImagepreviewMediaqueueMicrotaskreadBLECharacteristicValuereadyremoveStorageremoveStorageSyncremoveUserCloudStoragereportEventreportMonitorreportPerformancereportScenerequestrequestAnimationFramerequestMidasPaymentrequestMidasPaymentGameItemrequestSubscribeMessagerequestSubscribeSystemMessagerequestSubscribeWhatsNewrequirerequirePrivacyAuthorizerestartMiniProgramrestartMiniProgramSyncrevokeBufferURLsaveAppToDesktopsaveFilesaveFileSyncsaveFileToDisksaveImageToPhotosAlbumscanCodesendSocketMessagesetBLEMTUsetClipboardDatasetDeviceOrientationsetEnableDebugsetImmediatesetInnerAudioOptionsetIntervalsetKeepScreenOnsetMessageToFriendQuerysetPreferredFramesPerSecondsetScreenBrightnesssetStoragesetStorageSyncsetTimeoutsetUserCloudStorageshareAppMessageshareMessageToFriendshowActionSheetshowKeyboardshowLoadingshowModalshowShareImageMenushowShareMenushowToaststartAccelerometerstartBeaconDiscoverystartBluetoothDevicesDiscoverystartCompassstartDeviceMotionListeningstartGyroscopestopAccelerometerstopBeaconDiscoverystopBluetoothDevicesDiscoverystopCompassstopDeviceMotionListeningstopGyroscopesubscribeAppMsgtriggerGCupdateAppupdateKeyboardupdateSecondFloorChannelupdateShareMenuuploadFilevibrateLongvibrateShortwriteBLECharacteristicValue性能与体积
能不能不让所有用户都下载这 16 MB?
能,v0.9.4 起支持 nojni.aar:当前首包 0.40 MB,不含引擎;首启时由宿主下载(Play 走 PFD,其他渠道走自有通道),校验 sha256 后本地缓存。引擎和二进制与 AAR 内嵌版本相同,不是简化版。失败可重试,不必重启。
推到 22 万精灵会怎样?
Bunnymark 从 4 万加到 22 万,每档两遍取均值。膝点两边都在 4 万,差别在膝点之后:
| 精灵数 | 系统 WebView fps | Migo fps |
|---|---|---|
| 40000 | 60 | 60 |
| 70000 | 42.5 | 44.5 |
| 100000 | 31 | 32 |
| 140000 | 23 | 23 |
| 180000 | 16 | 17 |
| 220000 | 13 | 13 |
两边跌破 55 fps 的位置相同, 但 7 万 / 10 万 / 18 万三档 Migo 各高 1 fps。22 万这档远超真实游戏,两边都是 13 fps。
凭什么说各平台行为一致?
有一致性套件同一批断言在 Linux 参考实现、Android 模拟器、Mate 30 Pro 三台跑。2026-08-30 对 v0.9.6 实测,三次运行逐条一致:Linux 参考实现(x86_64)80/80、Android 模拟器(API 26,本引擎支持的最低版本)86/86、华为 Mate 30 Pro(API 31,arm64)86/86。多出的 6 条是只有真机才有意义的两个测试 —— 需要转屏、需要将 app 切到后台。跳过的断言必打印,绝不静默。首跑抓到三个真 bug: getImageData 空缓冲、ctx.font 一次赋值两个字号、新建 WebGL 首次 clear 回读空。仓库在 migo-conformance。
发布与平台
哪些平台已经发布?
- Android已发布arm64-v8a / x86_64。 AAR + Java/Kotlin SDK, minSdk 26。
- Linux已发布x86_64 / aarch64。 静态/动态库、pkg-config、CMake; Qt 6 / X11 宿主参考。
- Windows已发布x86_64 / aarch64。 migo.dll + 导入库、CMake。
- HarmonyOS NEXT已发布aarch64 / x86_64。 V8 不能 JIT, 见下一条。
- iOS已发布aarch64 设备与模拟器。 framework + C ABI。
- macOS已发布aarch64 / x86_64。
- C ABI 客户端候选不走 Java 层,直接 C 接自有渲染循环。接口未冻结。
产物在 releases,每包附 .attestation.json。
HarmonyOS NEXT 上有什么不一样?
自 5.0.0(12) 起第三方 VM 一律不能 JIT, V8 只能解释执行。在 Android 上用 --jitless 模拟过: 带 .wasm 的内容跑不起来, 纯 JS 内容吃满算力时帧率是 JIT 的 1/2.4 ~ 1/16, 膝点从 40,000 精灵挪到 2,000。轻量纯 JS 在高端机上不受影响, 内存反而低 5-9%。数据在 migo-bench JITLESS.md。
运营
出问题怎么回滚?
运行时随 App 构建固定版本,回滚到上一构建就回到上一运行时。系统 WebView 的版本不受你控制,做不了这个动作。
广告、支付和用户数据归谁?
归宿主。运行时不内置广告网络,不持有账号或商户凭证,只通过显式回调发起请求。 未实现能力按文档明确失败,不自行判定支付成功。 9 组回调不接的后果逐条写在 宿主回调页。
开源版本能直接用于商业产品吗?
源码 BSL 1.1, 可见可改。 生产使用先读 许可文本, 商务走 licensing@minigame-labs.com。 安全漏洞走 SECURITY.md。