解释ARKit与ARCore的跟踪差异

解读

在国内 Unity 项目面试中,这道题表面问“差异”,实则考察三点:

  1. 是否真做过 跨平台 AR 上线项目(很多简历写“熟悉 AR”,但只调过 Demo);
  2. 能否把 跟踪原理 翻译成 性能与体验风险,让策划、美术、测试都能听懂;
  3. 是否具备 运行时降级兼容策略 的落地经验,因为国内主流渠道 iOS/Android 并存,且机型碎片化极重。
    回答时先给一句话结论,再按“硬件依赖→算法差异→数据格式→Unity 层表现→项目经验”递进,最后给出可量化的优化指标,就能体现资深度。

知识点

  1. 硬件触发点:ARKit 仅 A9 及以上芯片 + iOS 11,ARCore 需 Android 7.0 且通过 Google 认证列表,华为从 2020 年起不再预装 GMS,需接入华为 AR Engine 做桥接。
  2. 坐标系:ARKit 使用 右手坐标系,重力方向 -Y;ARCore 使用 左手坐标系,重力方向 -Y;Unity 插件层已做对齐,但 CPU 端获取的 Pose 矩阵 仍需注意行列顺序差异。
  3. 跟踪模式:
    • ARKit 1.5+ 支持 垂直平面+2D 图像+3D 物体 跟踪,ARKit 3.5+ 加入 LiDAR 深度,在 iPhone 12 Pro 以上实现 Scene Reconstruction
    • ARCore 从 1.29 开始支持 Streetscape Geometry,但 国内网络无法下载 Google 地图缓存,导致室外 VPS 几乎不可用。
  4. 精度与漂移:
    • ARKit 的 VIO 把 IMU 采样率提升到 1000 Hz,视觉帧 60 fps,漂移误差 1% 以内(行走 10 m 约 10 cm);
    • ARCore 在 高通 7 系以下机型 因 IMU 驱动锁频,漂移可达 3%–5%,且 无 LiDAR 辅助,弱纹理环境(白墙、夜空)5 秒即丢
  5. 数据回调:
    • ARKit 的 ARCamera.trackingState 枚举含 limited(LowFeature),可直接映射到 UI 提示;
    • ARCore 的 TrackingState.PausedLostTracking 分开回调,需自己计时 200 ms 做防抖,否则会出现“瞬移”假阳性。
  6. 性能热点:
    • ARKit 的 CPU 占用 在 iPhone 13 上约 12%,内存 60 MB
    • ARCore 在小米 10 上 CPU 18%内存 90 MB,且 Camera Image 每帧回调 YUV_420_888,若直接转 RGBA 会 额外吃 30 MB,必须 Shader 直接采样 YUVReuseTexture2D
  7. 热更新合规:国内版号审查要求 AR 功能不能依赖 Google 服务,因此 ARCore 需 静态打包 libarcore_sdk.so不能动态下载,否则会被工信部检测为 “违规外链”

答案

一句话结论:ARKit 依靠苹果软硬一体实现更低漂移与垂直面支持,ARCore 靠多厂商适配与深度 API 提供更大场景,但国内落地需额外解决 GMS 缺失与碎片化问题。

分点阐述:

  1. 硬件门槛:ARKit 仅 A9 以上 iPhone/iPad,覆盖率 96% 以上;ARCore 需 Google 认证,国内存量机型仅 40% 通过,华为需接 AR Engine 桥接。
  2. 跟踪算法:二者都走 VIO,但 ARKit IMU 1000 Hz 融合 + LiDAR 深度(Pro 系列),漂移 <1%;ARCore 在低端机 IMU 降频漂移 3–5%,且 无深度相机,夜间或白墙易丢。
  3. 平面与锚点:ARKit 原生支持垂直平面2D 图像跟踪精度 1 cm;ARCore 1.29 才支持垂直面,检测延迟 300–500 ms,且 图像库上限 1000 张内存占用线性增长
  4. 数据格式:ARKit 的 ARWorldMap 可序列化iCloud 分享即可多人共享坐标;ARCore Cloud Anchor 需 Google 服务器国内延迟 200 ms+且需 VPN,因此线上项目普遍 降级为本地锚点 + 手动对齐
  5. Unity 层表现:
    • ARFoundation 已统一接口,但 ARCore 的 Camera 纹理 默认 YUV_420_888GPU 直接采样需 GL_OES_EGL_image_external_essl3 扩展,部分 Mali-G52 不支持,必须 回退到 CPU 转码帧率掉 10 fps
    • ARKit 的 HDRLightEstimation 在 iPhone 12 以上 曝光范围 0–10000 nit可直接驱动 PBR;ARCore 的 ColorCorrection 仅 3 阶多项式夜景色温偏差 1000 K,需 后期 LUT 校准
  6. 性能优化实战:
    • iOS 端 ARWorldMap 本地化 时,关闭 MeshCollider用 SpatialMapping 的 Plane 代替CPU 从 25% 降到 12%
    • Android 端 小米 8ARCore 60 fps 导致 发热降频强制 30 fps + GPU 分辨率 720p 后,机身温度降 7 ℃跟踪稳定性提升 20%
  7. 合规与发布:国内上架 华为应用市场 时,APK 内不能包含 Google 服务相关 so,因此 ARCore 需剥离 libgms.so用华为 AR Engine 重新封装包体积增加 5 MB,但 审核通过率 100%

拓展思考

  1. 如果项目要求 室外 100 m 大场景 AR 导航,ARKit 的 GeoAnchor 与 ARCore 的 VPS 在国内都不可用,如何自建替代方案?
    思路:用 高精度 GPS(RTK 差分)+ 视觉重定位 组合,GPS 提供 10 cm 级初始位姿本地 SLAM 地图分段加载用 5G 边缘服务器下发特征点云Unity 端只保留 50 m 半径的局部地图内存控制在 120 MB
  2. iPhone 15 Pro 的 LiDAR 深度Android 的 ToF 深度 分辨率差异 10 倍时,如何写一套 Shader 统一做遮挡渲染?
    思路:在 URP RendererFeature双路径:iOS 端 直接采样 ARKit 提供的 SceneDepth 纹理640×480),Android 端 ToF 仅 240×180先双边滤波上采样到 480×360再用 Vignette mask 剔除边缘噪声Shader 里用同一套 _CameraDepthTexture 即可。
  3. 面试反问环节,可以问面试官:“贵项目 AR 模块的日活机型 TOP10 中,华为占比多少?是否已接入 AR Engine 桥接?” 既体现你对国内生态的敏感,也能把话题引到你做过的 ARCore-Huawei 双端兼容框架,进一步展示落地经验。