试玩了一个网友的游戏还不错https://i.scwy.net/num_chomp/,把它导出成html5。
但Godot的通病就是导出文件比较大。这个H5导出后有70多MB,一个wasm文件都47MB。这对于一个网页有点灾难。
我是用Caddy作为“服务商”的,据AI说它可以压缩WASM文件(传说高达80%),浏览器支持流式解压,边下载边执行。于是找办法开启此功能。
原生的Caddy是不支持Brotli压缩的,需要自己编译。
这里需要用到xcaddy,它是caddy专用编译工具。
xcaddy build –with github.com/ueffel/caddy-brotli
或
sudo apt install libbrotli-dev
CGO_ENABLED=1
xcaddy build –with github.com/dunglas/caddy-cbrotli
后者是调用官方C库,性能更好,但需cgo支持。我使用了前者,毕竟只是小站。
然后在配置文件中设置如下示例:
example.com {
encode {
br 11 # Brotli最高压缩级
gzip
minimum_length 1400 # 仅压缩大于1400字节的文件
}
}
测试结果:果然有效!
不过即使是这样,依然存在:1.第1次载入可能需要刷新 2.载入时间测试时超过1分钟(>40MB)
测试中发现,因为文件较大,传输一会儿就会超时。
{
servers {
timeouts {
read_body 10m # 关键!大文件上传时,读取请求体的超时(默认15s)
read_header 10s # 读取请求头的超时(适当延长)
write 10m # 关键!大文件下载时,向客户端写入响应的超时(默认30s)
idle 10m # 空闲连接保持时间(防止长时间占用)
}
}
order encode before respond
}
Caddy来压缩还是太慢,它允许静态压缩
apt install brotli 安装 br 压缩工具
brotli –best index.wasm 压缩为 index.wasm.br
gzip –best index.wasm 压缩为 index.wasm.gz , 一并准备起。
设置Caddy配置文件,允许预压缩
:8088 {
root * /mnt/ramdisk/blog
encode {
br 11
zstd
gzip
}
file_server {
precompressed br gzip
browse
}
通过截图可以看到:虽然已传输是16.8MB,完成时间为6.39秒。主要的两个大文件:index.wasm 下载为6.3MB(当前最新版本4.5,未压缩时为37MB),index.pck下载为9.4MB(未压缩,似乎在Godot中它是压缩过的)。
终于睡得着了….
PS:通过JS下载zip,再解压的方法暂未测试成功(这样可以不依赖于代理)
由此还派生出一些新的疑问:
- 如果这个index.wasm是引擎本身的话,是否可以与其它H5导出共用。(index.pck应该是游戏体打包)
- 如果象APP端,在index.pck在运行中读取下载服务端的另一个场景进行后台加载,那又是一个什么情况。