技术限制
Details the technical limitations of the Web platform.
阅读时间6 分钟最后更新于 1 个月前
Web 技术对设计为在 Web 浏览器中运行的 Unity Web 应用程序施加限制。在为 Web 平台构建应用程序之前,请确保了解以下技术限制。
平台支持
大多数流行的桌面端浏览器版本都支持 Unity Web 内容,但请注意,不同的浏览器提供不同程度的支持。
由于平台本身的限制,Web 构建中的以下功能不可用或受到限制:
Visual Studio 中缺少 Web 构建调试支持
Visual Studio 不支持调试 Web 构建。有关更多信息,请参阅Web 构建的调试和故障排除。
缺少 Unity 缓存和缓存脚本支持
由于浏览器中对文件系统的访问受限,Web 构建不支持 Unity 缓存和缓存脚本 API。对资产数据和 AssetBundle 的网络请求将改为缓存在浏览器缓存中。请参阅 Web 中的缓存行为。
缺少线程支持
由于 JavaScript 中缺少线程支持,因此不支持线程。在 Unity 内部使用线程来加速性能以及在脚本代码和托管的 dll 中使用线程都是不受支持的。实质上不支持 命名空间中的任何内容。
System.Threading联网限制
有一些联网功能是 Web 平台不支持的:
-
出于安全考虑,浏览器不允许直接访问 IP 套接字来进行联网。有关更多信息,请参阅 Web 联网。
-
不支持命名空间中的 .NET 联网类。
System.Net -
由于浏览器内的安全限制,Web 平台不支持原生套接字访问。因此,Web 也不支持 ICMP ping 或 UnityEngine.Ping 等功能。
图形限制
WebGL 图形 API 基于 OpenGL ES 图形库的功能,因此 Web 平台存在一些限制。有关更多信息,请参阅 Web 图形。
音频限制
Web 构建使用基于 Web 音频 API 的自定义音频后端,但仅支持基本的音频功能。有关更多信息,请参阅 Web 中的音频。
动态生成代码
Web 是一个 AOT 平台,因此不允许使用 来动态生成代码。在所有其他 IL2CPP 平台、iOS 和大多数游戏主机上都是如此。
System.Reflection.Emit多线程支持
虽然 Unity 为原生 C/C++ 代码提供多线程支持,但由于 WebAssembly 的限制,Web 平台尚不支持 C# 多线程。这意味着使用 Web 平台构建的应用程序必须在单个 C# 线程上运行。
注意:
-
仅当在 Web 播放器设置中启用原生 C/C++ 支持时,Web 平台才支持 C/C++ 多线程。
-
当您的文档位于安全上下文中时,Web 平台支持多线程。以下 HTTP 响应标头必须由服务器设置。
在 Web 平台上执行复杂异步任务时,推荐使用协同程序。有关更多信息,请参阅协同程序文档。
以下因素限制了多线程支持:
本机堆栈扫描的约束
Web 平台使用 WebAssembly,这是一种字节码格式,用于在 Web 浏览器中安全高效地执行 Unity 代码。Web 浏览器被设计为在安全和隔离的环境中运行代码,从而阻止对 WebAssembly 本地堆栈的直接访问。这会影响多线程垃圾收集,因为 Web 垃圾回收器仅在每帧末尾运行一次,不像其他平台那样在多个帧上逐步递增。
不支持抢占式线程信令
Web 上的后台工作线程彼此独立并行执行代码。在原生平台上,主线程可以同步向其他线程发送信号以暂停垃圾收集。Web 不支持此同步信令,因此会阻止 WebAssembly 编译的 C# 代码在多线程中运行。
构建和运行限制
Unity 使用仅具有基本功能的 Web 服务器来托管使用构建并运行 (Build and Run) 创建的 Web 构建(菜单:编辑 (Edit) > 构建配置文件 (Build Profiles) > 构建并运行 (Build and Run))。
服务器不支持数据缓存,这会影响:
- 文件,其中包含不使用 AssetBundle 或 Addressables 的构建的所有场景和资产。
.data - Addressables 和 AssetBundle 文件。