View Full Version : Auto-updating games... good or bad?
Jack Norton
07-31-2005, 03:36 AM
This is an idea I had in mind for a while, I want to discuss it here to find out any possible downside.
The idea is: instead of downloading the whole demo, have a sort of launcher that downloads the single files (maybe zip-compressed) so the user has always the latest version. I think trymedia does something like that (not sure though).
Ideally it would download only changes, so if for example a user has game 1.2 and the new game 1.3 has only 2 pictures changed and nothing more, the user downloads only those 2 pictures data (about 250kb) instead of whole game again (imagine a 8mb game).
Many of you who have broadband will say "pah! I can download 8mb in 3 nanoseconds". Ok but the MAJORITY of users out there has 56/ISDN connection. Just keep receiving email about users who ask me if I use fullversion or serial, because if I use fullversion they wouldn't even consider downloading the demo! (believe it or not)
Another thing, if 1000 users download the 1.3 patch your server save A LOT of bandwidth instead of full game redownload.
So I see only advantages to this technique (save server bandwith, save users download time, save support for old version bugs), and thanks to PTK Kweb function that works both on pc+mac I could do it easily (I think).
Anyone else thought about that before? there's something that I'm missing? :)
Robert Cummings
07-31-2005, 05:18 AM
popcap does it, and they do most things right. I think it's a good idea to have a "click here to check for updates" option.
Savant
07-31-2005, 06:04 AM
Automatic updating is great if it actually is. I can't stand apps that check for an update, tell me one is available, but when I click the "yes, get it" button they take me to a web page.
No. Download the update for me and install it automatically. I don't want to be involved after clicking the "yes, get it" button.
princec
07-31-2005, 06:17 AM
We've been doing this in the Webstart world for years :) Truth is though that it seems to turn people off if it's automatic, so make sure you ask before doing the upgrade.
Ultratron now uses a system where it connects to my "message server" once it knows it's allowed to connect to the internet and checks the latest message and displays it. I can write anything I like in there like news of new games and such but the normal usage is to write "There's a new version available from www.puppygames.net!" and because of the way the affiliate system works it doesn't matter if the punters come and get it from my site before they've bought the game.
Cas :)
Jack Norton
07-31-2005, 07:56 AM
Yes, what had in mind was a button "check for updates" and then download the new files in the game directory itself.
The only problem is that I should make a separate "launcher" app to do this (I can't download and overwrite the currently running executable :p)
Yeah, I think autoupdates are heaven.
And yes, the last online game I worked on had an additional exe that would handle the patching. Main app runs, checks for patch, if patch is needed it would jump to the other exe, patch, then jump back. If I remember everything correctly... ;)
Kai Backman
07-31-2005, 01:11 PM
I have a simple few hundred line C++ function that does exactly this for ShortHike. It downloads changed files in place and switches the exe on the fly (it's a nice little dance with a second exe called HotCopy). Users can also decide if they want to have a 40MB or a 100MB version of the game, depending on how much they want to download. The larger version contains more detailed textures and stuff.
Here are my observations:
- I do Unstable updates to ShortHike pretty often and player like the fact they can upgrade very easily
- It also upgrades from the 15MB demo to the 40MB distribution on the fly
- You need to figure out the server side architecture. To be able to use a standard Apache server without modifications (or strange modules) I create a filelist as part of my build process
- You need a way to get your files from home to your server, I use rsync for that
- Make sure you handle interrupted downloads. Currently I don't let the player continue until they completed the update.
- Cas is right, westart does it automatically. On the downside you can't control how it looks, or exactly how it behaves (or has it changed Cas?)
Jack Norton
07-31-2005, 02:03 PM
Yes I did a search and saw your system... unfortunately is way beyond my brain :D I don't really know how to implement it, probably would take me 3 months !!!
I saw installer Vise has a similar function (check for latest version and is cross-platform) but unfortunately its prices are out of reach...
Hiro_Antagonist
07-31-2005, 02:47 PM
Automatic updating is great if it actually is. I can't stand apps that check for an update, tell me one is available, but when I click the "yes, get it" button they take me to a web page.
No. Download the update for me and install it automatically. I don't want to be involved after clicking the "yes, get it" button.
Isn't something better than nothing?
I'd like a game to tell me if there's a patch, or at least quickly present me with the information. That saves me the trouble of having to dig through a website to check for one, or just play with outdated/buggy code.
Of course, a full auto-updater is idea, but also probitively complex/expensive for many indie devs. I, for one, would still like something helpful instead of nothing though....
-Hiro_Antagonist
Hiro_Antagonist
07-31-2005, 02:50 PM
Another point on this topic:
I've heard from at least one dev house (was it popcap?) that they generally keep autoupdate turned off by default, though perhaps pro-actively asking once if they want to turn it on.
The reason why is that any internet ping at all will causing many dial-up users' machines to start dialing right away. Many modem users (of which there are many in the casual games customer space) therefore get frustrated that their match-3 game (or whatever) suddenly started using their phone line.
-Hiro_Antagonist
Kai Backman
08-01-2005, 04:06 AM
Hiro is right, that's why I use WinInet functions. Then you can decide if you want to force the internet connection or not. Currently you have to activate the update sequence manually so I'm forcing the connection open. When I implement the check/message functionality that polls the site for news that will be passive. My point, using WinInet to open the connection you can decide how you want to behave.
Jack, the new one is much simpler. It's a single self contained piece of code and it doesn't rely on SVN longer. PM or mail me and I can send you the source to play around with.
revve
08-01-2005, 09:37 AM
I have a simple few hundred line C++ function that does exactly this for ShortHike. It downloads changed files in place and switches the exe on the fly (it's a nice little dance with a second exe called HotCopy). Users can also decide if they want to have a 40MB or a 100MB version of the game, depending on how much they want to download. The larger version contains more detailed textures and stuff.
I've been looking at creating something similar for a while now, and I've always kept subversion in the back of my mind, but never really thought about using it. I then read your post about how you did it and I was really inspired. I was wondering if you could post some more info about how you now do it (unless it is a trade secret ;) ). Are you still using subversion / dav in the background, or are you just copying files natively.
I like the fact that subversion handles all the updates, compression bit-comparison for you to allow you to easily update the software and allow you to have small downloads, but I do not like having the .svn folders all over the show.
I was personally leaning towards creating something more like this:
* Client program distributed with game/program
* Client creates hash for each file in distribution and sends it to server.
* Server has database of each hash and set of diff/patches to allow client to upgrade to newer version
* Server returns (zipped?) list of patches the client will then apply to all nessecary files.
This way I will be able to control everything, but obviously, I will have a lot of work to do on both server side and client side to implement. My solution pretty much means I'll have to create my own mini version control system.
PS, since this is my first post on indiegamer, let me introduce myself. I'm Juan, from Cape Town, South Africa. I've lurked for a while as a guest, then registered and then lurked some more during the enforced one-week-period. I've been interested in indie game development for a long time now, bought several Torque engines over the last year, and recently decided to get seriously involved in this. I'm a full-time network administrator and aspiring indie game developer.
Kai Backman
08-03-2005, 01:12 AM
Sorry for dropping the ball on this earlier, naturally my algorithm is both primitive and shareable. :)
Here is basically what I do:
- During build on my dev machine I build a separate distribution directory and a filelist.txt file. The format is a simple. Each line contains MD5 sum, filesize and filename, all delimeted by space. The paths are relative. The file is sorted on MD5 sums. Here is a snippet:
FileList
00c64af63b385674514b843d835e0b77 28479 modules/orbit/mesh/TrussNode.mesh
01a182843db90f0d9b503a91ef4fbefb 693696 modules/orbit/texture/factory_diffuse.jpg
01e9ade302d6e4417ba21a82ae8d8c98 55 audio/music/messages.lua
066991523e712ae568e6f4f04524de52 2113 user_interface/mesh/PortMarker.mesh
0920e95168d2d17afa71f59b83304668 22486 ShortHike.ico
- All the files and the filelist get rsynced to the server over SSH, you could upload it any way you please. The server is a simple Apache server that pushes out the directory, no special trick here (that was one of my goals).
- When updating the client builds a similar filelist of the files available on the client. It then downloads the server filelist. Now a simple walkthrough creates a list of files to update and a list of files to delete.
- Download all updated files using simple HTTP GET, delete stale files.
It's essentially a poor mans rsync. It's a bit slower in that large files need to be downloaded in their entirety every time they change. But on the upside both the client and server are very simple. Less moving parts = less problems.
revve
08-03-2005, 04:29 AM
Thanks, Kai.
This is a lot simpler approach than I would have thought. This is probably easier to maintain and less to break, but I just really like the idea that you theoretically do not have to update the entire file if a small part of it changes.
Call me biased, but my Internet connection is a (if I'm lucky) 33.6 modem connection. I've been playing with getting my own svn based updating solution running, because of the small update sizes.
Have you had any problems with your svn updating system to prompt you to move to this new approach? I have noticed in my testing that binary files aren't always that much smaller than just copying the entire new file.
Juan
Kai Backman
08-03-2005, 04:56 AM
Juan, you have to sit down and figure out in which business you are. If your purpose is to create games you need to draw a line somewhere with this update stuff. I always need to focus to keep my eyes on the ball, sometimes these extra projects are pretty tempting. :)
- I moved from SVN because libsvn was a dog to compile and neon had funny crash issues that were very hard to track down. The server also got slowed down considerable by the mod_dav_svn access. SVN also doesn't give you any way to realiably calculate the size of the download or show a progress meter. You just get file updated callbacks with no information if the file is sized 10kB or 10GB.
- The benefit from rsync like capability is pretty small. Most players only update for larger releases and they are pretty infrequent. Files are usually new or change so much that a delta is larger than the updated file. RSync capabilities add a magnitude of complexity. If my current code is just 100's of lines, a rsync client would be 1000's. And the server needs to be special, now I can just host the files on any server I please (even stock dedicated file hosting services).
- You can always rework your assets to split a small frequently changed part away from a large non-changing one. You can even do this with the exe, to split stuff out into DLL's. All this is build side stuff, you only need to get it working on your computer and the update stuff remains the same.
revve
08-03-2005, 05:09 AM
True. In which business am I really. What is important for me to spend my time on. One of my (more serious) flaws is that I always try try to get the small things perfect, but never really get to the important stuff (in this case, finishing the game that will [ hopefully ] require the update module).
vBulletin v3.6.0, Copyright ©2000-2008, Jelsoft Enterprises Ltd.