发射器在游戏中最常见。想想英雄联盟,星际争霸II,或几乎任何MMO。在开始实际游戏之前,您有一个小型启动器应用程序,负责更新和修补。
我想用我正在开发的特定非游戏应用程序来移动这个方向。启动器的概念非常有意义:它检查更新,替换相应的二进制文件/库,可能运行完整性检查,并启动应用程序。但是,发射器如何更新自己?这往往是一个罕见的事件,但它是如何完成的?启动程序是否真的只是写了它当前正在运行的二进制文件?或者下载后是否有某种交换步骤?我需要能够将(罕见的)更新推送到启动器(特别是如果我在发射器中发现了一些错误)。
我的特定项目将在C#中,但我对概念上类似的C ++和/或Java解决方案感兴趣,以备将来参考。
答案 0 :(得分:5)
我从未尝试过,但这是我猜的(假设你不能覆盖正在执行的文件。如果可以,这就更简单了)
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, don't 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告诉我,使用transactional file IO可以更好地完成交换技巧。
答案 1 :(得分:2)
如果您处于.NET世界中,则会出现名为“Click Once”的部署策略。这是为了解决您描述的问题而创建的......
ClickOnce是一种部署技术,允许您创建基于Windows的自我更新应用程序,这些应用程序可以在最少的用户交互下安装和运行。 ClickOnce部署克服了部署中固有的三个主要问题:
来源:Click Once
在着手制定这一策略之前,我建议研究它的优点和缺点,因为有狂热的粉丝和诋毁者。
简而言之,您将新版本上传到网站(应用程序配置为了解)。在启动时,应用程序检查站点,如果有更新,则为用户提供对话框。当用户选择应用更新时,应用程序将停止,同时激活“单击一次”组件以应用更改。然后该组件重新启动可执行文件,这一切都显示为对最终用户的无缝操作...
答案 2 :(得分:1)
基本上,启动器检查是否有更新版本的自我,如果是这样,启动任务以获取新版本,然后执行它然后关闭。
鉴于更新程序应用程序很小并且加载速度很快,您可以让它检测,下载,粘贴一个对话框,说有新版本,并且随着旧版本关闭而新版本运行起来几乎没有闪烁。