Javascript 如何在网页上提供压缩文件,使其能够被函数提取并被库使用?

Javascript 如何在网页上提供压缩文件,使其能够被函数提取并被库使用?,javascript,php,three.js,Javascript,Php,Three.js,我正在用threejs制作一个应用程序。虽然我已经很好地优化了我的3d模型,但是如果我把所有的模型尺寸加起来,它是一个很大的数字,比如100-150MB,不包括纹理。我观察到,如果我压缩OBJ模型的大小急剧下降,8mb的OBJ会变成2mb,这是非常令人惊讶的 是否有任何方法可以加载zip文件,然后在客户端将其解压缩以供进一步使用。现在它只是一个网站,以后它将变成一个移动应用程序。有什么方法可以做到这一点吗?大多数服务器都支持发送gzip文件。您可以手动gzip它们,也可以配置服务器为您执行此操作

我正在用threejs制作一个应用程序。虽然我已经很好地优化了我的3d模型,但是如果我把所有的模型尺寸加起来,它是一个很大的数字,比如100-150MB,不包括纹理。我观察到,如果我压缩OBJ模型的大小急剧下降,8mb的OBJ会变成2mb,这是非常令人惊讶的


是否有任何方法可以加载zip文件,然后在客户端将其解压缩以供进一步使用。现在它只是一个网站,以后它将变成一个移动应用程序。有什么方法可以做到这一点吗?

大多数服务器都支持发送gzip文件。您可以手动gzip它们,也可以配置服务器为您执行此操作。服务器将gzip文件发送到浏览器。浏览器以透明方式解压,这意味着从您的POV来看,它看起来没有被压缩。所以没有理由发送zip文件。只需了解如何从服务器发送gzip文件。您可以在浏览器的开发工具的“网络”选项卡中检查它们是否被gzip压缩

我不能告诉你怎么做,因为它是特定于每台服务器的,但是你可以用谷歌搜索你的服务器名称和gzip或压缩,也许你可以找到怎么做

例如,如果我们检查网络工具并添加response->content encoding列,我们可以看到大约一半下载的文件是gzip文件

threejs.org由github页面提供,github页面无法配置文件的服务方式。它选择gzip.js文件和.gltf文件,但不选择.bin或.jpg文件,但您可以在自己的服务器上自行配置

您还可以从Connection ID列中看到,所有文件都是通过单个连接提供的,这类似于将它们作为单个文件提供,因此只要服务器配置正确,就没有理由将它们放在单个文件中

您还可以从图中看到许多文件是并行下载的。zip文件不能发生的事情。我不知道哪一个在网络上更快,但让服务器和浏览器这样做的好处是,它们的解压缩速度更快,并且不需要在页面中添加额外的代码


如果你真的想下载zip文件,那么你需要向你的页面添加更多的数据(zip库本身)无论需要什么额外的集成来将数据中的路径从zip文件转换为blob URL,再加上解压文件所需的实际时间以及解压zip文件所需的额外内存。纹理的图像将更加糟糕,因为您将首先下载zip文件,然后从zip文件中提取图像数据。然后将该数据作为blob返回浏览器,然后为该blob获取一个URL,将其转换为
,这样你就可以让浏览器解码,就像让服务器/browser/http处理这一切一样,所有额外的处理和内存都消失了。

ZIP可以做而Gzip不能做的事情是在一个http请求中打包多个文件。@阿尔瓦罗冈萨雷斯,浏览器和服务器已经通过HTTP的不同部分处理多个文件,所以只要正确配置服务器,问题也就解决了。如果您在上面的演示中选中“网络”选项卡中的“连接ID”列,您将看到github通过一个连接为所有文件提供服务,这实际上与将它们压缩到一个文件相同。您还可以通过图形看到它们是并行下载的。我的意思是请求而不是联系。您仍然可以为每个单独的文件获得一组请求/响应头;这增加了一些开销。我没有游戏编程方面的专业知识,但我想我们谈论的不是一打资产。无论如何,我理解并同意你回答的要点,这只是一个额外的暗示。顺便说一句,当使用不同的连接时,发送单个gzip文件可以从并行下载中获益。重复使用连接意味着串行下载,尽管它们之间没有“间隙”,因为你不需要关闭连接并协商新的连接。我感觉如果你真的进行测试,使用zip文件将在每一次CST中失败。下载速度慢,解压缩速度慢,准备使用速度慢,缓存未命中的情况也更糟,因为如果你在下一次访问时对小东西进行更改,整个zip都必须重新加载。基本上,zip文件是网页的错误工具。