Hello,
I have a survival type game, where I save certain variables from my actors, and when loading I first destroy existing actors (if any), then spawn fresh actors and restore variables to actors from save file.
However, only sometimes, my game crashes during saving or loading and I get the following crash message:
Fatal error: [File:D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Private\GenericPlatform\GenericPlatformMemory.cpp] [Line: 200] Ran out of memory allocating 50237006952 bytes with alignment 0
KERNELBASE
UE4Editor_Core
UE4Editor_Core
UE4Editor_Core
UE4Editor_Core
UE4Editor_Core
UE4Editor_Core
UE4Editor_StoneAgeColony_5538!TArray<TSparseArrayElementOrFreeListLink<TAlignedBytes<24,4> >,FDefaultAllocator>::ResizeTo() [c:\o\epic games\ue_4.21\engine\source\runtime\core\public\containers\array.h:2474]
UE4Editor_StoneAgeColony_5538!TSet<TTuple<FName,float>,TDefaultMapHashableKeyFuncs<FName,float,0>,FDefaultSetAllocator>::operator=() [c:\o\epic games\ue_4.21\engine\source\runtime\core\public\containers\set.h:250]
UE4Editor_StoneAgeColony_5538!ASettlementMember::RegisterActorDetailsToSave() [d:\stoneagecolony\source\stoneagecolony\settlementmember.cpp:278]
UE4Editor_StoneAgeColony_5538!GameSaver::RegisterActors<ASettlementMember>() [d:\stoneagecolony\source\stoneagecolony\gamesaver.cpp:89]
UE4Editor_StoneAgeColony_5538!GameSaver::SaveGame() [d:\stoneagecolony\source\stoneagecolony\gamesaver.cpp:45]
UE4Editor_StoneAgeColony_5538!AObjectBed::OnUsed() [d:\stoneagecolony\source\stoneagecolony\objectbed.cpp:31]
UE4Editor_StoneAgeColony_5538!AStoneAgeColonyCharacter::Use() [d:\unreal projects\stoneagecolony\source\stoneagecolony\stoneagecolonycharacter.cpp:454]
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Core
UE4Editor_Core
UE4Editor_Core
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_UnrealEd
UE4Editor_UnrealEd
UE4Editor
UE4Editor
UE4Editor
UE4Editor
UE4Editor
kernel32
ntdll
I store my variables into a class that inherits from “USaveGame”. When saving, I just store required variables to instance of this class, and when loading I read from save file and assign variables to my actors. For some variables, I created a struct and do saving-loading of variables through these structs. For example:
USTRUCT(BlueprintType)
struct FHumanCharacterDetails
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Location")
FTransform Transform;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpecialID")
FString SpecialID;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HomeSpecialID")
FString HomeSpecialID;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProfessionName")
EProfession ProfessionType;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FaceDetails")
TMap<FName, float> FaceDetails;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Equipment")
TMap<EEquipmentSlots, int32> EquippedItems;
};
I register variables like this:
void ASettlementMember::RegisterActorDetailsToSave()
{
Super::RegisterActorDetailsToSave();
// Assign details to struct.
CharDetails.Transform = GetActorTransform();
CharDetails.FaceDetails = MorphManager->FaceDetails;
CharDetails.SpecialID = SpecialID;
CharDetails.HomeSpecialID = HomeSpecialID;
CharDetails.ProfessionType = Profession.Type;
// Save equipments
CharDetails.EquippedItems = EquipmentManager->EquippedItems;
// Save details as struct to communicator. Which will be used during saving.
Communicator::GetInstance().SpawnedCharacterDetails.Add(CharDetails);
}
And read back like this after spawning my actors during loading:
FTransform ActorTransform = Details.Transform;
auto Spawned = Communicator::GetInstance().World->SpawnActor<ASettlementMember>(ActorToSpawn, ActorTransform, SpawnParams);
Spawned->SetupBelongingSettlement();
Spawned->SpecialID = Details.SpecialID;
Spawned->HomeSpecialID = Details.HomeSpecialID;
Is there something i am missing? The fact that I get these errors only sometimes worries me. I tried closing-reopening editor and only sometimes I get this error. Also sometimes I get an error when reading from a data table which gives me an access violation error. But only like 1 in 10 tries.
Edit: Typo