应用程序启动器如何自行更新?

2022-09-02 13:56:54

启动器在游戏中最常见。想想英雄联盟,星际争霸II,或者几乎任何MMO。在开始实际游戏之前,您有一个小型启动器应用程序,负责更新和修补。

我想通过我正在开发的特定非游戏应用程序来推动这个方向。启动器的概念非常有意义:它检查更新,替换适当的二进制文件/库,可能运行完整性检查,然后启动应用程序。但是,启动器如何自我更新?这往往是一个罕见的事件,但它是如何完成的呢?启动器是否只是简单地覆盖了它当前运行的二进制文件?还是在下载后有某种交换步骤?我需要能够将(罕见的)更新推送到启动器(特别是如果我在启动器中发现一些错误)。

我的特定项目将采用C#,但我对概念上相似的C++和/或Java解决方案感兴趣,以供将来参考。


答案 1

我从未尝试过,但这是我的猜测(假设您无法覆盖正在执行的文件。如果可以的话,这一切都更简单)

Updater A checks if its the newest version
If launcher isnt the newest version
    Download the differences (to save bandwidth) to file B
    Apply the delta to own code into file C
    Launch file C.
    Close
If file C exists (update happened recently)
    Try to delete C  (update was previous launch, delete temporary file)
    If delete fails  (We are C, means A is out of date)
        Copy C over A  (update launcher)
        Note that you can keep going, dont have to restart even though we are C.
If game isnt newest version
    Download the differences (to save bandwidth) to file B
    Apply the delta to game into file D
    delete game
    Rename D -> game
Run game

André Caron 向我展示了交换技巧在事务性文件 IO 中做得更好。


答案 2

基本上,启动器会检查是否有更新版本的自我,如果是这样,则会启动一个任务以获取新版本,然后执行它然后关闭。

鉴于更新程序应用程序很小并且加载速度很快,您可以让它检测,下载,粘贴一个对话框以说明有新版本,并且随着旧版本的关闭和新版本的运行,几乎不会闪烁。


推荐