快速高效的更新程序

Spa*_*117 11 c# performance

我正在为游戏客户端开发更新程序,以便玩家在更新时不必下载整个客户端.

现在,创建标准更新程序并不是很难,但是对于大文件来说它很慢.

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

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

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

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

  • 类似Rsync的diff更新程序 - 这会加快下载速度,因为它只会获取文件的不同部分,而不仅仅是下载整个文件.这会很有用,因为通常客户端更新不会影响大文件的许多部分.但我想这对于这个目的来说会有些过分.

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

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

  • 版本系统 - 它实际上不会加速任何东西,但更新程序不必计算所有哈希值.并且通过额外的"修复"功能,它可以根据用户想要检查所有文件与实际版本.

我应该使用哪些解决方案,还是我没有列出我应该使用的任何方法?

Luk*_*uke 2

压缩单个文件

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

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

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

并行化

对哈希文件进行比较后,您可以向服务器发送请求以获取需要下载的文件列表。然后,您的下载程序可以连续传输每个文件,并且在收到这些文件时,其他线程可以解压缩并移动下载的文件。