Binary Compressed Save System, Save Entire Dynamically Generated Worlds! ♥ Rama

Wow you fast on the forums @motorstep :slight_smile:

Ya I’ve not forgotten you, working toward it :slight_smile:

:heart:

Rama

New Build Sneak Prieview ~ Support for UE4 SaveGame Tag & Multiple comps with SameName

Dear Community,

My next Rama Save System release will feature support for the UE4 SaveGame tag on actor and component properties, meaning you can just check that property on any property you create. For existing properties in the engine that cannot be altered to work with SaveGame, my string variable list still works as well.

I also am going to be supporting having multiple subcomponents of an actor where the subcomponents all want to save vars that have the same name. Previously names had to be unique.

Enjoy!

:heart:

Rama

I did not buy your plugin yet, i am just currious :slight_smile:

Thanks for your reply. Currently we are offline, with multiplayer to come in the near future.
Right now the workaround is (VR-Game): ESC has been disabled for closing the editor/game. Within the player character, which is always existing, ESC->Save->QuitGame. This will give your actor the opportunity to suck in some fresh air :wink:

I’ve already seen your async saving in action and it looks dam good. Thats what we would need for VR to keep the game going. In your demo video you are saving a whole bunch of data of actors that are static in the world, not moving, not able to receive input. But how is async saving working out if the player is still able to input data, change object state, automatic moving objects are moving, while async saving is going? Especially in multiplayer games this is a reasonable question, cause you can’t freez the game for tons of players just cause you are doing your periodic 5min interval save.

With unreals SaveObject system it’s always: load slot->if not exist, create it->save data to it->save slot. Means you append data to the given savegame.
With your save system it is: Save. You pickup every actor with a RamaSaveComponent and store it. But how about appending only changes to an existing save like SaveObject from Unreal? Am I missing something?

cheers

Rama Save System Update Is Live ~ Save Game Property Tag / Multiple subcomponents

Dear Community,

My new update is live!

Now you can specify properties that you’ve created that you want my save system to save by checking off the Save Game property flag!

Also you can now save properties that share the same name across multiple subcomponents of the same actor. :slight_smile:

Here’s the 13 minute video explaining these new features!

:heart:

Rama

That’s a great question! Although my save process is asynchronous / multi-threaded, I process an entire unit in 1 go, even on the other thread, so there’s no risk of data integrity loss due to an actor’s values changing partway through a save process. In otherwords, when an actor is saved, the snapshot is taken all at once, not across multiple ticks, so the snap shot is complete and coherent. So in your example of users applying input during an async save, whenever that particular user’s player unit is saved, the snapshot is coherent and the data is safe.

Every save is designed to be a self contained snap shot of the world and all actors in it, to reload a server state, or reload a single player game, or reload a dynamically generated world constructed from a lot of user input.

Backup and game-state reload where the intent.


**All Files Are Compressed using ZLIB to Smallest Possible Binary File Sizes**

I am using binary serialization and then zipping that file to compress it to smallest storage size on disk, so appending to such a file is rather complicated of a thought. The data pulled into a single file comes from many locations, every actor in the world, so there is no simple one pre-zipped memory location I could store stuff in an appendable way, nor was it something I was even considering in my core design as to me a save file is a snap shot of the entire world, all at once, and that is the easiest system to actually use rather than having to remember what you updated and what you didn't. :)

If you want a complete save of the world / scene state that is compressed to smallest binary size, that is what my save system is designed for. :)

♥

Rama

Thanks for your reply Rama.

Interesting, but not what I actually wanted to know. But did not think about it the way you did, so the question may be a bit to broadly asked. I was more thinking about a the whole state of the server and the time dissipation between the save of the actors.

Imagine a game where you loose all items when you die. There is a huge battle ongoing and async save is in progress. Lets say PlayerA has been saved. Now PlayerA and PlayerB die at the same time. Now PlayerB is getting saved. And the server was shut down because what ever (maybe power failure). After reloading the server PlayerA got all his items because he was saved before death, PlayerB lost everything cause he was saved after death.

Whith your explanation from above, thats exactly what might be happening?

We create tons of actors at runtime. Everything is about actor creation. We might need to save 1000+ actors with a single save. Lets say we are saving 1 actor a frame/tick, and running in VR with 90 FPS we would need 1000/90=11,11secs for a single save. During that time multiple actors could have been spawned.
What about actors that get spawned during async save? Do these make it still into the save?

Keep up the greate work.

cheers.

One solution that comes to my mind for async saving (progressive over time) over a large world while the world is running is to see if all byte data about an actor that will be saved can be dumped to memory, but not serialized fully.

Then, the serialization process could occur over time, but it would be the data from a few moments ago so that everyone is saving the same frame.

I imagine that dumping the byte data to memory would not take that long even for 1000s of actors, given that my system is designed around minimizing the number of actor variables that really need to be saved.

It is something I can process over time but in the meantime I’ve already got another new update, see next post!

:heart:

Rama

New Feature ~ Static Data Saving & Loading, Load Data Before World Even Loads!

Dear Community,

Hi there!

I’ve added another new complimentary feature!

This feature, entirely optional, lets you create a traditional Save Object using my special Rama Save Object class that you can pass along with the bulk of the world actor save data.

This data could be stuff like player progression, inventory, team score to persist after map change, etc.

The advantage of this static data, and the reason I call it static, is because it is not associated with any particular actor and does not need a valid actor to be spawned in order to be loaded.

So if you had main menu settings you wanted to load right before the world even becomes visible to the player, you can use this new feature to load those default settings!

You can store as much stuff as you want in the Rama Save Object, any global data that you previously might have been using a Global Save Actor for!


**BP-Assignable File Header**

I think of my new feature as a BP-assignable file header for each save file!

You can store information here that you want to load while browsing save games, without loading the actual save file and all the actors in it!

Things like
1. Time of save in in-game time
2. Picture data to display for save file
3. Players in party at time of save
4. total game progress % at time of saved.

Now you can easily load just the data you want so that players can see into their save file prior to loading it.

See video for full details!

♥

Rama

https://youtube.com/watch?v=rdKuni_Fvxk

Just want to go out here and say RAMA is the best.

Nice new features, but still no Android support ? :confused:

Just got this plugin 2 days ago. Tried using the Rama Save Object per the video instructions. When saving with static data, the save true/false returns a true message. But when loading static data and casting to my blueprint (that is a child of Rama Save Object, with just 1 variable of type integer), the cast fails. Tried recreating the blueprint, etc, no bueno.

nvm: spoke way too soon - forgot to construct the object !!!
Sorry about that :slight_smile:

But alas I do have a question - This save object will not let me add a custom component blue-print into it? I tried, it crashes UE4, but if i only add simple types of variables such as integers, etc it works.

What is the best way to setup multiple levels and how to save all levels actors and variables with your plugin?
No multiplayer/network. Using world composition with very large maps, distance level streaming disabled with a layer in the level editor, using blueprints to load levels in the level blueprint of the persistent level map.
I need to setup multiple planets scenes and each set of tiles will be a planet on its own.

  1. I could create separate folders with a persistent level map and world composition enabled for each planet map having then the tiled landscape very large maps as sub-levels automatically placed in sub-folders. This way I would have a customized skysphere on each without having to load/unload different skysheres at runtime.
  2. Or I could create a single folder with a persistent level map and world composition enabled with sub-folders for each set of tiled landscapes sub-levels. Then I would have to load/unload skyspheres at runtime.

The question is what is the best setup of the two to use with your plugin then? Is it better having a single persistent level and load/unload tiled landscapes sub-levels with level streaming in the level blueprint and that’s it or is it better having multiple persistent levels with a set of tiled landscape sub-levels each ?
With multiple persistent levels how do I use your plugin to read/write overall gaming stats and actors variables configs and state then? Every time I would switch from a persistent level to another I would lose everthing if unsaved, right? So how to use your plugin to save the overall game stats when switching between persistent levels ?

I hope it is clear what I want to do.

I don’t serialize uobjects by choice, they are stored as string asset paths. If you have a component or ptr to something that is not an actual asset, UE4 will not be happy about that during load time.

I chose to not serialize uobjects to keep save file sizes as small as possible, and they are currently utterly tiny.

I will consider adding a feature to optionally save some uobjects more vigorously, but getting UE4 to like me serializing a component as you describe is going to take awhile. I suggest adapting by storing a class path (violet class ptr instead of blue object ptr), which can be serialized.

Hee hee, yeaaa sorry, but I enjoy your persistence :slight_smile: And nice Legend status you got there!

Question in marketplace:

“Hello there. Is there any tutorial how to save widgets with this, I Have combo boxes with options (Graphic settings) I would love to save those with this system.”

My answer:

Hi there!

  1. You can make a separate save file (remember with my plugin you can create as many files as you want and name them anything you want, and store them wherever you want :))
  2. So make a file you will load only statically, and create a save object containing all of the UI settings and any other player settings you want :slight_smile:
  3. You can load this file any time you want, including only when the user opens the related UI window
  4. This video explains static data saving/loading
    https://youtube.com/watch?v=rdKuni_Fvxk
    :heart:

Rama

You can store player stats and such as a Static Data file that is saved separately, and can travel wherever you want along with the main game saves that are loading worlds of data.

You would thus have two files

  1. Player Data (statically loaded, no actor data)
  2. Worlds Data (normal save/load process with my system)

Is it safe to assume no Android support is coming ? :confused:

I mean, it’s not like Android folks don’t have a need in saving their progress as they venture through the game :o

As soon as I have time I will work on the Android build, the Android OS is a sandbox environement that makes UFS (unreal file system) have to do unusual tricks to operate within, and I have to work with that technical issue in order to support my “save your files anywhere you want” model with the Rama Save System.

I have no lack of respect for your request, it is just technically involved and I have to devote a lot of the time to the topic which I’ve not yet been able to make available.

:heart:

Rama

Hey Rama! New update for the save system today, anything fun in it? :slight_smile: