Hi,
there’s a few different ways to go about patching, each with pros and cons.
I’ll be answering first how the built in patch feature works, but in general it is probably better to use an external solution, since the built-in patching has some limitations.
> Is it possible for a new version’s PAK file to be downloaded partially, i.e., only the parts that have changed, rather than the entire file?
Partially. The built-in patching system allows you to create a “Patch Pak” that will only contain the changed assets.
This new pak would need to be dropped next to the existing ones and the assets in the patch pak would override the ones in the base pak.
This approach is somewhat limited in that it can only replace full assets and doesn’t support any binary delta patching (i.e. changing one pixel in a texture asset will include the full texture in the patch).
This also requires that you use extra parameters when creating the original release, if your release is just the regular output of the package process then you are likely missing the metadata about your release that is necessary to create patches.
> Is it also possible to update directly from version A to C with only the changed parts of the PAK file being downloaded?
You can create a full patch C based on the base release A. This would require deleting the patch paks from B and adding the newly created ones for C. As an alternative it is possible to create Patch C based on patch B, in which case you would need the patch paks from b and c to update A.
> More generally, is it possible to update any older version of the game to the latest version by downloading only the differences in the PAK files?
If your game also contains C++ code then likely not. If your game logic is blueprints only and the engine version does not change then it should be possible to replace only the pak files.
The built-in patching would require you to download additional pak files and keep the original ones.
In general the built-in patching is a fairly simple implementation, it can create patch paks but it’s based on per asset changes and is not intended to work over a long time. If you’re doing many updates to a game at some point you would want to create a new base release with new pak files to get rid of the patch paks (which will add up in install size if certain assets are replaced multiple times).
The docs for your built-in patching can be found here.
Overall we do recommend external binary patching solutions over the built-in patch paks.
A binary patcher can generate a binary delta patch that only replaces the parts of a pak file that have actually changed.
There is no built-in tool that does this, usually every platform has it’s own patching approach.
I.e. Steam or the BuildPatchTool for EGS will automatically create delta patches between two full releases, without requiring explicit support from the engine.
To make those binary patches effective it is important to minimize the changes in the source pak files and keeping the order of files inside the pak consistent.
Our packaging docs have a section on “ordering your pak file”.
In many cases it also helps to not compress the pak file and let the platform handle compression for the generated patches/downloads.
This will result in larger install sizes so you might still want to use some compression for the data on mobile at the expense of larger patches.
Hopefully this gives you a starting point for choosing a direction, I’m happy to go into more detail on the built in features if there’s further questions.
For external tools we unfortunately don’t have much advice to give, you would need to investigate the options that the Android/Apple tools provide.
Kind Regards,
Sebastian