Wonderland Engine的优化
为了在您的WebXR应用中实现更复杂的应用程序和场景,Wonderland Engine实施了多种优化。以下是一个非详尽列表:
渲染性能
针对更快的帧渲染进行的优化。
双四元数场景图
虽然传统的场景图使用矩阵实现,但Wonderland Engine的场景图使用双四元数。
双四元数只需要4x4矩阵一半的内存,并且在拼接时需要较少的操作。
由于双四元数仅代表旋转和平移,我们用一个独立的缩放向量来增强它们。
双四元数对于蒙皮特别有利,因为它们比其他方法更好地保持体积。结合场景图,这一点集成得很好。
运行时合批
Wonderland Engine在运行时将网格合并在一起,以便通过单个绘制调用绘制多个网格。由于每个网格通常使用不同的材质,我们有特殊的着色器能够使用材质列表以不同方式绘制批的一部分。
纹理会自动组合到“纹理图集”中。
这种优化通过将成千上万的绘制调用合并为一次调用来大大减少绘制调用,只要它们共享相同的着色器。
压缩纹理和纹理流
通过在GPU上使用压缩纹理格式,Wonderland Engine可以更高效地使用GPU内存。同样的GPU内存容量可以容纳更多的纹理,并且场景中的纹理分辨率可以更高。
此外,我们的_纹理流_功能根据相机能看到的内容,在内存中交换纹理的一部分。这使得在内存受限环境中也能使用高分辨率纹理。
WebAssembly (C++)
Wonderland Engine 是用 C++ 编写并编译为 WebAssembly。
WebAssembly 为 Wonderland Engine 提供了对内存使用的更多控制,并比 JavaScript 提供了更高的性能。计算密集型功能,例如计算场景图变换或内存密集型功能如合批可以更高效地实现。
WebAssembly SIMD
WebAssembly中的SIMD指令允许在单个指令中处理多个数据。这大大加快了矢量数学的速度。
自2023年3月以来,WebAssembly SIMD在所有主流浏览器上均得到支持。
数据导向设计
Wonderland Engine的场景图和组件系统以及代码库的其他部分遵循数据导向设计 (DOD)。DOD是一种编写代码的方式,通过改善缓存使用和帮助预测性代码执行,使数据能更有效地被CPU处理。
加载时间
针对更快加载进行的优化。
二进制场景格式
由于在编辑器中已经将文本(例如gltf
或obj
文件)解析为WebGL的二进制格式,数据会以二进制格式直接传递给运行时。
这些二进制数据布局方式使运行时使用它们进行渲染所需的努力最小化。
这也让我们能够对例如网格数据进行量化:如果知道属性值范围,有些网格属性可以以较少的位数存储。
Basis Universal图像压缩
每种设备对压缩纹理格式的支持不同。使用Basis Universal,我们可以将图像压缩为单一格式,然后转换(“转码”)为设备特定的压缩GPU纹理格式。
动画压缩
我们使用量化并去除冗余关键帧,以减小动画的尺寸。
运行时大小
我们特别注意保持WebAssembly二进制文件的大小小,并保持依赖项的足迹小,因为运行时是首先要下载的内容之一。
我们当前的WebAssembly运行时大约为580 kB(gzip压缩)并在不断减少。
特殊优化
特定平台的优化。
iOS和Apple Vision上的Safari
2022年我们重写了渲染器的大部分,以确保在iOS上获得优秀的性能。
如今,Wonderland Engine在iOS上的性能可以与Android上的性能相媲美。由于Apple Vision PRO上的Safari继承了相同的性能特征,因此我们在那里也提供了卓越的性能。