我正在构建一个 webgl 应用程序。它需要反序列化大约 15MB 的数据(这是单个对象的大小,我的应用程序中将有大约 10 个),并且该数据的较大部分(90%)是一些 float 数组,这些数组需要在 JavaScript 中反序列化为 Float32Arrays。
目前我正在使用 JSON。由于我的数据包含大量重复数字,因此它具有高度可压缩性,并且我对网络性能感到满意。除了。我也对其在桌面上的性能感到满意。然而,将数据加载、反序列化为普通 JS 数组,然后在移动设备上将其转换为 Float32Arrays 需要花费大量时间。
我考虑过使用 protobuff 但我在 https://protobuffers.codeplex.com/ 上看到了这个
Protocol Buffers are not designed to handle large messages. If you are dealing in messages larger than a megabyte each, it may be time to consider an alternate strategy.
那么我可以做些什么来提高我的应用程序的性能。我应该测试哪些 SERDES 方法?
请引导我完成这个过程并帮助我测试我的替代方案,如果您在评论部分提出任何问题,我会提供更多详细信息。
最佳答案
如果您的对象就像一个大 float 组,您可以发送原始字节而不是 JSON 编码的字符串。
XMLHttpRequest
具有 responseType = "arraybuffer"
。这样,您的“解析步骤”就减少为 var floats = new Float32Array(xhr.response)
。
它甚至会减少这个任务对内存的影响,因为你不需要保留一个 15MB 大字符串 + 一个包含大约 20MB double 的中间数组,我猜 + 包含另一个 10MB 的结果 Float32Array < em>( double 的一半)几乎同时发生。
您有 1 个仅包含原始字节的 ArrayBuffer + 一个在内存中引用此数据的 Float32Array。
如果这对您不起作用,也许您可以解释您发送的数据的性质/结构。
或者也许是您在后端使用的代码(如果序列化是问题所在)。
关于javascript - 移动设备上性能更好的 JSON 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38281262/