广告 SDK 加载须晚于游戏主循环启动至少1秒,避免因引擎接管渲染上下文导致初始化失败;激励视频需用户交互后加载,全屏广告展示时应手动控制游戏暂停/恢复,重启场景需延迟执行以防白屏。

广告 SDK 加载时机必须晚于游戏主循环启动
很多开发者在 onload 或 DOM 就绪后立刻加载广告 SDK(如 AdMob、穿山甲),结果发现 showInterstitial() 报错或黑屏。根本原因是 HTML5 游戏引擎(如 Phaser 3、Cocos2d-js、PixiJS)通常会接管 canvas 渲染上下文并禁用默认滚动/焦点行为,而部分广告 SDK 初始化时依赖 window.focus、document.visibilityState 或可点击的 body 节点。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 等
game.scene.start()或engine.run()稳定运行至少 1 秒后再调用广告 SDK 的init() - 检查广告 SDK 文档是否要求「用户交互后才允许展示激励视频」——此时必须绑定在按钮
onclick或pointerdown回调里触发loadRewardedAd(),不能自动预加载 - 若使用 iframe 嵌入广告(如某些国内聚合 SDK),需确保 canvas 容器有
z-index高于 iframe,否则遮挡点击
Phaser 3 中拦截 pause/resume 避免广告打断渲染
Phaser 3 默认在页面失焦(切后台、锁屏)时调用 game.pause(),但广告 SDK 展示全屏广告时也会触发 visibilitychange,导致游戏误判为「用户离开」而暂停音频和定时器,关掉广告后画面卡死或音效丢失。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 在广告 SDK 的
onAdShow()回调中手动调用game.loop.sleep()(Phaser 3.60+)或game.step = false(旧版),而非依赖自动 pause - 广告关闭后,在
onAdClosed()里执行game.loop.wake()+game.sound.resumeAll() - 务必取消监听
document.addEventListener('visibilitychange'),改由广告状态驱动生命周期
激励视频广告回调中避免直接调用 game.scene.restart()
常见错误:用户看完激励视频后,代码直接写 scene.restart(),结果触发场景重载 → canvas 被清空 → 广告 SDK 的 overlay 层残留、音频上下文断开、甚至白屏。这是因为部分广告 SDK(如腾讯优量汇)关闭动画结束时间点早于 Phaser 场景销毁完成。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 用
scene.time.delayedCall(100, () => { scene.restart(); })延迟 100ms 再重启 - 更稳妥的做法是先
scene.stop(),再scene.scene.start()新实例,避免复用旧对象 - 如果奖励是数值型(金币、道具),优先走服务端验证回调,前端只做 UI 提示,不依赖广告 SDK 的客户端回调完整性
Cross-Origin iframe 广告与 WebGL 上下文冲突
某些国内广告联盟(如百度网盟、快手联盟)强制使用 iframe 加载广告素材,而 HTML5 游戏若启用了 WebGL(renderer: 'webgl'),iframe 内脚本可能因跨域限制无法读取 canvas 像素,或触发 SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D',导致激励视频无法播放。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 在初始化游戏时显式关闭抗锯齿:
antialias: false,减少 WebGL 上下文敏感度 - 给广告容器 div 设置
style="position: absolute; top: 0; left: 0; pointer-events: none;",防止 iframe 拦截 canvas 事件 - 若必须支持截图分享类广告,改用
canvas.toDataURL('image/png')导出,而非依赖广告 SDK 自动抓帧
setTimeout(fn, 0))或延迟帧(requestAnimationFrame)对齐两者状态。











