【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题

【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题

【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题

在开发 Web 应用时,尤其是集成了 Unity WebGL 内容的页面,遇到一个问题:当 Unity WebGL 渲染内容嵌入到一个 Tab 中时,切换 Tab 后画面会变黑,直到用户点击黑屏区域,才会恢复显示。

这个问题通常是因为 Unity 渲染在 Tab 切换时被暂停或未能获得焦点所致。

在本文中,我们将介绍如何在使用 Layui 框架时,通过监听 Tab 切换事件并强制 Unity WebGL 渲染恢复,来解决这一问题。

1. 问题描述

当 Unity WebGL 内容嵌入到页面中的多个 Tab 中时,用户切换 Tab 时,Unity 渲染内容可能会变黑。问题的根源通常是 Unity 渲染在 Tab 切换后没有正确地恢复,导致渲染被暂停或者丢失。

2. 解决思路

要解决这个问题,关键是确保每次切换到包含 Unity WebGL 的 Tab 时,Unity 渲染能够继续运行。具体思路如下:

  • 监听 Tab 切换事件:通过 Layui 框架提供的事件,监听 Tab 切换,获取当前激活的 Tab。
  • 强制 Unity canvas 获取焦点:每当 Tab 切换时,通过 JavaScript 强制切换到的 Tab 中的 Unity canvas 元素获得焦点,这样 Unity 渲染就能继续正常显示。

3. 解决方案实现

步骤 1:监听 Tab 切换事件

Layui 框架中的 element 模块提供了 tab 事件,可以用于监听 Tab 的切换。当 Tab 切换时,可以通过事件获取到当前活动 Tab 的索引值,并确定哪个 Tab 中包含 Unity WebGL 内容。

步骤 2:获取当前 Tab 中的 Unity canvas

Unity WebGL 通常嵌入在一个 iframe 中,iframe 内部包含 Unity 渲染的 canvas 元素。在 Tab 切换时,我们需要访问该 iframe,并获取其中的 Unity canvas 元素。

步骤 3:强制获取焦点

JavaScript 的 focus() 方法可以确保 canvas 元素获得焦点,从而恢复 Unity 的渲染。

完整代码实现
layui.use(['element'],function(){var element = layui.element;// 监听 Tab 切换事件 element.on('tab(xbs_tab)',function(data){// 获取当前选中的 tab 对应的 iframevar activeTabId = data.index;var iframe =$('.x-iframe').eq(activeTabId);// 获取当前 tab 对应的 iframe// 获取 iframe 中的 Unity canvas 元素,若存在,则主动获取焦点var unityCanvas = iframe.contents().find('#unity-canvas')[0];if(unityCanvas){ unityCanvas.focus();// 强制 Unity canvas 获取焦点}});});

4. 代码解析

  • layui.use(['element'], function() {...}):加载 Layuielement 模块,使用 element 模块来处理 Tab 事件。
  • element.on('tab(xbs_tab)', function(data) {...}):监听 tab(xbs_tab) 事件,用户切换 Tab 时触发该回调函数。
  • $('.x-iframe').eq(activeTabId):通过 activeTabId 获取当前选中的 Tab 对应的 iframe 元素。
  • iframe.contents().find('#unity-canvas')[0]:获取当前 iframe 中的 Unity WebGL canvas 元素。
  • unityCanvas.focus():强制 Unity canvas 获取焦点,确保渲染恢复。

5. 测试与优化

在实现了上述代码后,切换 Tab 时 Unity 渲染应能正常恢复。如果仍然存在渲染延迟或异常的情况,可以尝试以下优化措施:

  • Tab 切换时延迟处理:如果需要在 Unity WebGL 内容加载完成后再恢复渲染,可以在切换 Tab 后稍作延迟再调用 focus() 方法。
  • 确保 iframe 加载完成:确保 iframe 中的内容加载完成后再进行焦点恢复操作。可以通过监听 iframe 的加载事件来控制焦点的恢复时机。

6. 总结

通过监听 Layui 框架的 Tab 切换事件并强制 Unity WebGL 的 canvas 元素获取焦点,我们成功解决了 Unity 渲染在 Tab 切换时变黑的问题。这个方法简单有效,不依赖于浏览器的 focusvisibilitychange 事件,因此在 Tab 切换时能够稳定地恢复渲染。

如果你在开发过程中遇到类似问题,希望本篇博客能为你提供一些帮助和启发。如果有任何问题或其他解决方案,欢迎在评论区交流!

Read more

【openclaw】从提示词到状态机 —— 基于 MEMORY.md 的 Agent 任务栈架构实践

【openclaw】从提示词到状态机 —— 基于 MEMORY.md 的 Agent 任务栈架构实践

目前的 AI Agent 开发中,我们正经历一个关键的范式转移:从单纯的“提示词工程 (Prompt Engineering)”走向系统化的“上下文工程 (Context Engineering)”。 当 Agent 处理长周期、多步骤的复杂任务时,单纯依靠 LLM 自身的上下文窗口必然会导致“上下文腐败 (Context Rot)”——模型会在长对话中迷失最初的目标,甚至产生幻觉。将 MEMORY.md 改造为“任务栈 (Task Stack)”,本质上是为大模型外挂了一个可视化的图灵机状态纸带。 以下是关于这一改造思路的深度技术思考与架构设计。 为什么选择 Markdown?—— “Memory as Documentation” 理念 目前业界对 Agent 的记忆管理主要有两条路线: 1. Memory as Database:使用 Milvus 等向量数据库存储历史。

By Ne0inhk
Spring Boot 视图层与模板引擎

Spring Boot 视图层与模板引擎

Spring Boot 视图层与模板引擎 19.1 学习目标与重点提示 学习目标:掌握Spring Boot视图层与模板引擎的核心概念与使用方法,包括Spring Boot视图层的基本方法、Spring Boot与Thymeleaf的集成、Spring Boot与Freemarker的集成、Spring Boot与Velocity的集成、Spring Boot的静态资源管理、Spring Boot的实际应用场景,学会在实际开发中处理视图层问题。 重点:Spring Boot视图层的基本方法、Spring Boot与Thymeleaf的集成、Spring Boot与Freemarker的集成、Spring Boot与Velocity的集成、Spring Boot的静态资源管理、Spring Boot的实际应用场景。 19.2 Spring Boot视图层概述 Spring Boot视图层是指使用Spring Boot进行Web应用开发的方法。 19.2.1 视图层的定义 定义:视图层是指使用Spring Boot进行Web应用开发的方法。 作用:

By Ne0inhk

Flutter for OpenHarmony: Flutter 三方库 ntp 精准同步鸿蒙设备系统时间(分布式协同授时利器)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 分布式开发、金融交易或具有严格时效性的业务(如:秒杀倒计时、双因素认证 OTP)时,开发者不能完全信任设备本地的系统时间。用户可能为了某种目的手动篡改时间,或者由于网络同步问题导致时间存在偏差。 ntp 软件包提供了一种直接与互联网授时中心(NTP 服务器)通信的能力。它能绕过本地系统时钟,获取绝对精准的 UTC 时间,并计算出本地时间与真实时间的“偏移量(Offset)”。 一、核心授时原理 ntp 通过测量往返网络延迟来消除误差。 发送 NTP 请求 (UDP) 返回高精度时间戳 鸿蒙 App 全球授时中枢 (pool.ntp.org) 计算网络往返耗时 (RTT) 得出绝对时间偏移量 生成鸿蒙业务专用准时 二、

By Ne0inhk
Spring Boot 数据导入导出与报表生成

Spring Boot 数据导入导出与报表生成

Spring Boot 数据导入导出与报表生成 24.1 学习目标与重点提示 学习目标:掌握Spring Boot数据导入导出与报表生成的核心概念与使用方法,包括数据导入导出的定义与特点、Spring Boot与数据导入导出的集成、Spring Boot与数据导入导出的配置、Spring Boot与报表生成的基本方法、Spring Boot的实际应用场景,学会在实际开发中处理数据导入导出与报表生成问题。 重点:数据导入导出的定义与特点、Spring Boot与数据导入导出的集成、Spring Boot与数据导入导出的配置、Spring Boot与报表生成的基本方法、Spring Boot的实际应用场景。 24.2 数据导入导出概述 数据导入导出是Java开发中的重要组件。 24.2.1 数据导入导出的定义 定义:数据导入导出是指将数据从一个系统导入到另一个系统,或从一个系统导出到另一个系统的过程。 作用: * 实现数据的迁移。 * 实现数据的备份。 * 实现数据的共享。 常见的数据导入导出格式: * CSV:Comma-Separated Values,逗号分

By Ne0inhk