Page 1 of 1
Saving on background thread
Posted: Wed Feb 10, 2021 7:34 pm
by VoodooDetective
I was just wondering if the save system uses a thread to save game data. I couldn't find any threading, and I want to make sure I don't cause hiccups by saving. Just curious if that's something I need to implement or not.
Re: Saving on background thread
Posted: Wed Feb 10, 2021 8:09 pm
by Tony Li
Hi,
Saving occurs in two phases:
1. Recording saved game data.
2. Storing saved game data to persistent storage (e.g., disk file).
For (1), in games with huge dialogue databases that use SimStatus, the operation that takes the longest is saving the Lua environment. But you can configure PersistentDataManager to run asynchronously, in which case it runs on the main thread but in a coroutine that batches a limited amount of activity in each frame. Generally speaking, though, this isn't enough to cause any hiccups so you rarely need to run PersistentDataManager asynchronously.
On the other hand, (2) can cause hiccups if you're writing to specialized storage such as cloud storage, since you may need to establish a network connection, do some handshaking, etc. Consoles in particular have a requirement that saves must run asynchronously or on a separate thread. SavedGameDataStorer has a method
StoreSavedGameDataAsync that can store data asynchronously. The built-in saved game data storers save synchronously, but you can subclass them to kick off the save in a separate thread or coroutine.
Re: Saving on background thread
Posted: Wed Feb 10, 2021 8:44 pm
by VoodooDetective
Ahhh ok that all makes sense. I think I'll test this out on different devices before I start worrying about implementing async then. Thanks so much for all the information!
Re: Saving on background thread
Posted: Wed Feb 10, 2021 9:12 pm
by Tony Li
Sounds good! If you're saving to the cloud, you'll probably want to set up async. And if you're saving on a console platform, the platform requirements will almost certainly require it. But the nice thing about the save system is that, since it's modular, you can cross that bridge when you come to it.
Re: Saving on background thread
Posted: Wed Sep 01, 2021 12:31 pm
by bennett
We were trying to figure out why we couldn't get async saving to happen on this system, and wondering why PersistentDataManager.cs has a GetSaveDataAsync() method that is never called by anything. The code in SaveGameDataStorer was illuminating:
Code: Select all
public virtual IEnumerator StoreSavedGameDataAsync(int slotNumber, SavedGameData savedGameData)
{
StoreSavedGameData(slotNumber, savedGameData);
progress = 1;
yield break;
}
In other words, the system never does anything async, it just has async methods that are either never called or which are named async but just do everything all in one call. Was the idea that these things would be turned into async functions in some later update?
Re: Saving on background thread
Posted: Wed Sep 01, 2021 1:48 pm
by Tony Li
Hi,
No, the idea is that your custom subclass will implement StoreSavedGameDataAsync as needed for whatever platform you're on. The code will be different for each platform.