Update game client without full rebuild resources DLC

Developed app is the sequence of locations each of which is presented by the single downloadable package.
In the future we plan to download some game objects such as weapon, npc etc. as well, but for now it’s not so important.
We have integrated MobilePatchingUtils module so we are able to build separated app and set of DLCs for each location, download them from cloud storage and mount them at runtime.

The problem is how to implement client version updates via market properly.
For now each new version is associated with its own unique set of DLCs so will be forced to redownload packages even if nothing was changed there.

We’ve tested on 4.14.3 and even when the game is built from the same source twice result packages won’t be the same.
Though these packages seems to be interchangeable, means app A can work with packages B and app B can work with packages A.
We cannot recognize when some package was changed during version update and as result deliver only changed packages to .

Another problem we faced is that all DLC packages are built based on the associated main app (to exclude already existing assets) but other DLCs are not considered.
In our case when some asset is used in several locations (DLCs) but not in the main app it will be included in all these DLCs.
Obviously it should be included only in the DLC where it appears for the first time to reduce size of data for to download.

So the questions are:

  • is it possible to recognize whether some package was changed using built-in UE4 utilities?
  • is it possible to handle data duplication in DLC packages?
  • maybe you have some recommended workflow to handle these issues? If not existing solution then some advice or good practices will be appreciated

The solution we are thinking about:

  • move all downloadable content from the main project to plugins (one for each package). As it’s done manually we can avoid data duplication in some way
  • include content in packages not by root .umap files but by root plugin directory
  • we can track changes in package by checking timestamps for all files within plugin directory by some external script
  • we can make plugin directories read-only after app released to reduce chances that files are changed accidentally

Could you please comment the solution? Are there anything we forgot? Maybe we are missing something obvious?

Anton,

I am not quite sure what you are asking here: “is it possible to recognize whether some package was changed using built-in UE4 utilities?” However, during the patching process, the engine will compare all the content post-cook to the originally released cooked content. When it does that, it’ll then determine what needs to be included in the patch. If you change even the smallest part of the project’s content and it is in any single included package, it will include that whole entire package in the patch. You can read more about that in our [Patching Documentation][1].

Let me know if the documentation is unclear as I’ll be more than happy to obtain additional information for you.

Thanks!

Updating Unreal Engine Projects With Patches After Release | Unreal Engine 5.1 Documentation

Hi ,

Is it actually possible to patch assets from DLC package using approach you gave link to?
I mean patch is built based on released version (AssetRegistry.bin and result .pak file) but it know nothing about assets that were moved into separated downloadable packages. So how can it track difference in these assets?

Also does patching process support chain of patches? I did a little test some time ago and failed to produce any positive result. Is only single patch file per released version allowed?

Thanks in advance!

Hi Anton,

So the questions are: - is it possible to recognize whether some package was changed using built-in UE4 utilities?

We have been working on making the cooker more deterministic. It’s a difficult task but there have been improvements.
Tracking these issues down is usually caused by some objects being non deterministic on load, I.e for a simple case they will generate a random number in PostLoad and then save that out in the cooked packages.
The common instances are;

PostLoad rebuilds some data and it’s not deterministic because of random numbers.

Some uobject checks the state of some other uobject in postload and does something based on that (Uobjects can be loaded out of order so if you are reading data from them you need to call ConditionalPostLoad on it).

There are other instances. But PostLoad is usually the root of the cause.

is it possible to handle data duplication in DLC packages?

We don’t have that support out of the box for this feature.
You would need to modify the way the basedonrelease works.
You can do this, you would need to save off the asset registry of the DLC then when building the next DLC essentually load both the asset registries (one from the base game and DLC). Then use that to cook.

Thanks

Okay, thanks!

Then I think we will stick with our current solution.
Seems it will be cheaper than modifying build scripts.