-
Notifications
You must be signed in to change notification settings - Fork 26
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[RFC] 新增量更新(OTA)格式 #146
Comments
不管怎么说,支持 zstd patching |
@horror-proton @ABA2396 来看看这几个未解决的问题 😶 |
This comment was marked as resolved.
This comment was marked as resolved.
也就是说可能在版本之间跳来跳去? 感觉打包和和解压的算法会比较复杂? 是不是还应该假设大部分人都是从比较近的版本更新, 应该保证他们下载更少的分块而不是要跳好几次, 远古版本没什么人用就无所谓了 ( |
整体只支持更新到最新版本,二进制差分只支持往前跳多个版本。 比如说要支持 1 2 3 4 5 五个版本更新到 6,可以打包 1-3, 2-3, 3-5, 4-5, 5-6。这样版本 3 更新时还是不会下载到给版本 1 和 2 准备的分块。
|
哦只要不会出现 5-3, 3-6 这样反向的就好, 另外如果 5 有 1000 个用户, 4 有 100 个用户, 3 有 10 个用户, 那 3-4, 4-5, 5-6 存储积体积小, 但是 3-4, 4-6, 5-6 总下载量小, 这种情况怎么算, 是不是比较组合的时候还得有个系数之类的 (现在服务器是怎么算费用的来着) 虽然不大知道 TAR 文件级索引是什么意思, 但为啥会需要部分下载, 客户端一般都是只需要整个分块然后下载完了再一起更新吧 (除非是要一边下载一边更新文件?), 下载断了也是继续下载当前分块? |
资源热更只下载缺少的文件什么的,现在再看感觉是个 XY 问题( |
打包程序:https://github.com/MaaAssistantArknights/UpdateEngine ~~解包程序要先鸽一会了(~~已经搞定了 |
打包解包都做好了,集成继续开鸽! 或者找几个帕鲁来写( |
issue 正文:
设计目标
减少增量更新的数据量(存储+传输)
基础格式
pax tar 带压缩
压缩要求
a.gz+b.gz
可以不经任何后续处理直接解压出a+b
。可用实现
https://www.rfc-editor.org/rfc/rfc1952.html#page-5
https://github.com/facebook/zstd/blob/release/doc/zstd_compression_format.md#skippable-frames
文件布局
总览
更新时删除文件
删除的文件列表存放在增量清单内。
Corner Case
为确保完整解压时不会出现当前版本已删除的文件,不打包中间版本之间新增后删除的文件,即不能通过增量更新包更新到中间版本。
二进制增量更新
增量清单内存放:
patch 后版本可以是新版本方向的任意版本,生成增量更新包时寻找体积最小的组合。
Corner Case
需要 patch 的文件与某一更新版本一致时,使用特殊 patch 类型标记且不存储 patch 数据。
实现
https://github.com/facebook/zstd/wiki/Zstandard-as-a-patching-engine
效果
由于文件头包含清单长度,使用标准 HTTP Range request 时最多产生三个 GET 请求,允许中断一个完整 GET 请求时只需要一个请求。
其他设计
ZIP 格式
未解决的问题
非线性版本历史(如 Cherry-pick)
例:
暂定方案:
本分支版本按时间排序后,非本分支版本寻找位置插入,使得按顺序加权后的总文件变化数量最小。
更新包内的文件级索引
预期用途:修复单个损坏的文件。
结论:谁啊,不认识。
解压时增量清单及二进制增量数据 entry 的处理
增量更新程序不将增量清单及二进制增量数据提取到文件系统。
对于手动解压的情况,二进制增量数据在压缩包内的路径使用约定的临时目录,首次运行时删除。
游戏资源热更
是否也使用此方式,作为独立更新通道更新?
The text was updated successfully, but these errors were encountered: