(原) Caddy对WASM压缩加速

原创文章,请后转载,并注明出处。

试玩了一个网友的游戏还不错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,再解压的方法暂未测试成功(这样可以不依赖于代理)


由此还派生出一些新的疑问:

  1. 如果这个index.wasm是引擎本身的话,是否可以与其它H5导出共用。(index.pck应该是游戏体打包)
  2. 如果象APP端,在index.pck在运行中读取下载服务端的另一个场景进行后台加载,那又是一个什么情况。

相关文章