Skip to content

数据分析与埋点设计

预计阅读 30 分钟
版本信息
最后更新:2026-07-09 · 适用基础库:≥ 3.9.0(最低兼容 ≥ 2.30.0)

"如果无法衡量,就无法改进。" 数据分析是游戏迭代和变现优化的核心能力。本章讲解小游戏埋点体系的设计原则、微信数据助手与 wx.reportAnalytics 的使用边界,以及如何设计一套可扩展的自定义事件系统。


埋点体系的分层

层级工具/方式用途实时性
运营诊断wx.reportAnalytics异常监控、简单计数分钟级延迟,可能采样
业务分析自建后端 / 云开发留存、付费、漏斗实时或准实时
A/B 实验自建实验平台策略效果对比准实时
崩溃监控Sentry / 微信异常监控错误堆栈、性能告警近实时

事件设计原则

1. 事件命名规范

采用 "动作_对象_场景" 的三段式命名,便于聚合和筛选:

game_start        → 游戏开始
level_complete     → 关卡完成
ad_show_rewarded   → 激励视频展示
purchase_success   → 支付成功
ui_click_shop      → 点击商店按钮

2. 事件参数设计

每个事件应携带"who、when、where、what、how"五个维度的上下文:

typescript
interface BaseEvent {
  event: string
  userId: string // openId 或设备指纹
  sessionId: string
  timestamp: number
  version: string // 游戏版本号
  platform: string // android / ios / devtools
  baseLib: string // 微信基础库版本
}

interface GameStartEvent extends BaseEvent {
  event: 'game_start'
  source: string // 启动来源:share / search / history
  level: number
}

3. 用户隐私合规

  • 不要采集 IMEI、MAC 地址等敏感设备信息。
  • openId 虽非明文个人信息,但仍需在隐私政策中声明用途。
  • 未成年人相关事件需做脱敏或不上报。

常用指标与漏斗

核心指标

指标计算方式用途
DAU/MAU日/月活跃用户衡量用户规模
次日留存D2 活跃 / D1 新增衡量首日体验
平均游戏时长总时长 / 游戏次数衡量玩法粘性
广告渗透率看广告用户数 / 活跃用户数衡量广告变现空间
ARPU总收入 / 活跃用户数衡量变现效率
付费率付费用户 / 活跃用户衡量付费转化

典型漏斗

曝光商店 → 点击商品 → 调起支付 → 支付成功
  100%      40%         15%         10%

通过漏斗可以定位最大流失环节。例如 "点击商品→调起支付" 流失严重,可能说明价格锚点或商品展示有问题。


上报实现示例

typescript
class Analytics {
  private static queue: Record<string, any>[] = []
  private static flushTimer = -1
  private static readonly BATCH_SIZE = 20
  private static readonly FLUSH_INTERVAL = 10000

  static init() {
    this.startFlushTimer()
  }

  static track(event: string, params: Record<string, any> = {}) {
    this.queue.push({
      event,
      ...params,
      timestamp: Date.now(),
      sessionId: this.getSessionId(),
      // ⚠️ 可选链需要双重保护:方法可能不存在,调用结果也可能为 undefined
      baseLib: wx.getAppBaseInfo?.()?.SDKVersion ?? '',
    })

    if (this.queue.length >= this.BATCH_SIZE) {
      this.flush()
    }
  }

  private static startFlushTimer() {
    clearInterval(this.flushTimer)
    this.flushTimer = setInterval(() => this.flush(), this.FLUSH_INTERVAL)
  }

  private static flush() {
    if (this.queue.length === 0) return
    const batch = this.queue.splice(0, this.BATCH_SIZE)

    wx.request({
      url: 'https://your-analytics-server.com/track',
      method: 'POST',
      data: { events: batch },
      success: (res) => {
        if (res.statusCode >= 400) {
          this.queue.unshift(...batch) // 失败回队,限制长度防止无限增长
        }
      },
      fail: () => {
        this.queue.unshift(...batch)
        if (this.queue.length > 100) this.queue.length = 100
      },
    })
  }

  private static getSessionId(): string {
    try {
      let sid = wx.getStorageSync('analytics_session_id')
      if (!sid) {
        sid = `s_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`
        wx.setStorageSync('analytics_session_id', sid)
      }
      return sid
    } catch {
      return `s_${Date.now()}`
    }
  }
}

A/B 测试埋点

A/B 测试需要单独的事件来记录分组和结果:

typescript
// 用户进入实验分组时上报
Analytics.track('ab_exposure', {
  experimentId: 'ad_interval_v2',
  group: 'B',
  strategy: { adInterval: 240000 },
})

// 实验关注的目标事件
Analytics.track('ad_rewarded_show', {
  experimentId: 'ad_interval_v2',
  group: 'B',
  scene: 'revive',
})

服务端根据 experimentId + group 聚合,计算各组的广告渗透率、人均观看次数、留存等指标。


📝 课后练习

练习 1:设计一个付费漏斗

题目: 为皮肤商店设计一个从曝光到支付的完整事件体系,列出至少 5 个事件及其关键参数。

参考答案:

  1. shop_expose — 商店曝光:skinId, position
  2. skin_click — 点击查看皮肤:skinId, price
  3. purchase_click — 点击购买按钮:skinId, price, currency
  4. purchase_invoke — 调起米大师支付:skinId, orderId
  5. purchase_success — 支付成功:skinId, orderId, amount
  6. purchase_fail — 支付失败:skinId, errorCode

本章小结

  • 埋点体系应分层:wx.reportAnalytics 用于诊断,业务指标用自建后端。
  • 事件命名采用 "动作_对象_场景" 三段式,参数包含完整上下文。
  • 核心指标包括留存、时长、ARPU、付费率、广告渗透率等。
  • A/B 测试需要单独记录分组曝光和目标事件,便于服务端聚合分析。
  • 注意用户隐私合规,敏感设备信息不应采集。

用心学习,持续实践