Safari 和 Apple Vision Pro 上的 WebGL 性能
Safari——特别是在 iOS 上——一直被认为是构建 3D 网页时开发者面临的性能挑战的巅峰。WebGL 基于 Metal 的实现,再加上 WebKit 独特的性能特征,让开发更具挑战性。
在这篇文章中,我们将为您提供一些提高 Safari 上 WebGL 应用性能的见解。
Apple Vision Pro
随着近期 Apple Vision Pro 的发布,Safari 上的 WebGL 性能变得更为重要,因为该版本的 Safari 继承了 MacOS 和 iOS 上 Safari 的所有性能特性。
我们即将发布关于 Apple Vision Pro 上 WebXR 的完整文章,订阅我们的新闻通讯以便及时获取通知。
Wonderland Engine 在 Apple Vision Pro 上
如果您已经在使用 Wonderland Engine,我们有好消息:我们在 0.9.0 版本所做的所有优化都适用于 Apple Vision Pro。
拥有 Apple Vision Pro 的开发者报告称,他们基于 Wonderland Engine 的应用在设备上的性能十分出色:
针对 Safari 的优化
如果您使用的是其他框架,务必查看我们的WebGL 性能分析博客文章。该文章提供了关于如何找出应用程序瓶颈并确定优化方向的建议。
此外,以下是在性能分析时您可能在 Safari 中遇到的一些注意事项。这些不是万能方案,请具体分析您的应用程序以找出影响性能的问题。
瓶颈
以下是在 Safari 上使用 WebGL 时可能遇到的一些具体问题:
Uniform Buffers
由于 Apple 的图形 API Metal 与 WebGL 的差异,Safari 需要在底层模拟 WebGL 风格的 uniform buffer。这种模拟增加了预测 UBOs 性能的难度:某些用例可能没问题,而其他情况可能在错误的时间上传数据时导致 150ms 的卡顿。
这段代码片段来自 Angle 的 Metal 实现(WebKit 使用它实现 WebGL2 API),展示了与 WebGL 的 bufferSubData
等效的 GLES 实现。这让我们认识到浏览器开发者为提供一致的图形 API 所付出的努力。这也显示了 Wonderland Engine 团队为帮助您理解和优化浏览器性能所做的努力。
关于 Safari 长时间未发布 WebGL2 支持的问题引发了很多争议,尽管有猜测称他们可能永远不支持,但最终他们在 2021 年 9 月的 Safari 15 中发布了 WebGL2 支持。阅读 WebKit 和 Angle 的代码让我们理解这项任务的困难所在。
WebGL 状态访问
WebGL 的 getParameter
函数可能在性能上带来一些意外的惊喜。这个看似无害的函数可能会消耗大量的性能预算。
WebGL 错误
虽然使用 getError
检查错误通常是个好主意,但请尽量避免在帧回调之外使用它,因为它可能比预计的更耗费性能。
内存和限制
WebGL Safari 将报告关于纹理大小、层数、uniform buffer 大小等的限制。查看这些限制的一个好工具是 webglreport.com。
尽管 Safari 理论上允许您分配达到这些限制的资源,但可能会导致页面崩溃。
为了更有效地使用 iOS 上的内存资源,Wonderland Engine 提供了一项名为 Texture Streaming 的功能,来根据当前帧的需求动态地交换内存中的纹理片段。此功能默认启用。
结束语
我们将很快发布关于 Apple Vision Pro 上 WebXR 的详细博客文章。订阅我们的新闻通讯以便在发布时收到通知。
在此之前,我们希望您尝试使用 Wonderland Engine!特别是如果您使用过 Unity,Wonderland Engine 更容易上手。
请务必加入我们的 Discord 服务器,我们乐意为您提供指引和资源帮助您入门。