gpt4 book ai didi

c# - 快速高效的更新程序

转载 作者:可可西里 更新时间:2023-11-01 08:48:18 25 4
gpt4 key购买 nike

我正在为游戏客户端开发一个更新程序,这样玩家在更新时就不必下载整个客户端。

现在,创建一个标准的更新程序并不难,但处理大文件会很慢。

客户端大约有 1.5 GB 的未压缩文件和大约 250 个文件。更新服务器上的文件是 gzip 压缩的,并通过 HTTP 下载。

更新程序是这样工作的:从服务器获取补丁列表 -> 将补丁列表中的文件与本地文件进行比较 (crc32/filesize) -> 如果丢失/错误文件大小/哈希不相同 -> 从服务器下载 gzip 压缩文件 ->解压文件

更新程序最耗时的部分:为每个文件生成 crc32 哈希/下载大文件

我想到了一些可以加快速度的事情:

  • Rsync-like diff updater - 这会加快下载速度,因为它只会获取文件的不同部分,而不只是下载整个文件。这会很有帮助,因为通常客户端更新不会影响大文件的许多部分。但我想这会有点矫枉过正。

  • 更好的压缩 - Gzip 在压缩客户端时节省大约 200 MB。我没有尝试使用其他一些压缩方法,但我猜 bzip2、lzma 或其他方法会节省更多空间并加快下载速度。具有讽刺意味的是,它们会减慢文件的解压缩速度。

  • 其他文件检查方法 - 目前我正在使用 C# crc32 实现,因为它比标准的 c# md5 实现更快。有没有更快的算法可以判断文件是否相同?

  • 版本系统 - 它实际上不会加速任何事情,但更新程序不必计算所有哈希值。如果用户愿意,它还可以通过额外的“修复”功能检查所有文件是否符合实际版本。

我应该使用这些解决方案中的哪些,或者是否有任何我没有列出但我应该改用的方法?

最佳答案

压缩单个文件

您可以只下载新文件或更改过的文件,而不是下载整个包。

在客户端和服务器上存储哈希值

通过预先计算哈希值,您可以节省大量时间。您的哈希比较步骤变成了存储所有文件哈希的单个文件的差异。这在功能上与版本控制系统相同,但“版本”更难被愚弄。用户很容易打开版本的纯文本文件并将数字设置为下一个版本以跳过补丁。如果您想防止这种行为,哈希稍微更安全。

并行化

执行哈希文件差异后,您可以将请求发送到服务器以获取需要下载的文件列表。然后,您的下载器可以连续流式传输每个文件,并且在接收到它们时,其他线程可以解压缩并移动下载的文件。

关于c# - 快速高效的更新程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18405932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com