Skip to content

Commit 4a471d9

Browse files
committed
Refactored Save Filters
Filters are copied less, only baked once, and optimized now Intended to fix cross-level loading, but the problem is elsewhere :(
1 parent 16baaee commit 4a471d9

24 files changed

Lines changed: 259 additions & 179 deletions
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Copyright 2015-2020 Piperift. All Rights Reserved.
2+
3+
#include "LevelFilter.h"
4+
5+
6+
/////////////////////////////////////////////////////
7+
// USaveDataTask
8+
9+
const FName FSELevelFilter::TagNoTransform { "!SaveTransform" };
10+
const FName FSELevelFilter::TagNoPhysics { "!SavePhysics" };
11+
const FName FSELevelFilter::TagNoTags { "!SaveTags" };
12+
const FName FSELevelFilter::TagTransform { "SaveTransform" };

Source/SaveExtension/Private/LifetimeComponent.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ void ULifetimeComponent::EndPlay(EEndPlayReason::Type Reason)
4646
Super::EndPlay(Reason);
4747
}
4848

49-
void ULifetimeComponent::OnSaveBegan(const FSaveFilter& Filter)
49+
void ULifetimeComponent::OnSaveBegan(const FSELevelFilter& Filter)
5050
{
5151
if (Filter.ShouldSave(GetOwner()))
5252
{
5353
Saved.Broadcast();
5454
}
5555
}
5656

57-
void ULifetimeComponent::OnLoadFinished(const FSaveFilter& Filter, bool bError)
57+
void ULifetimeComponent::OnLoadFinished(const FSELevelFilter& Filter, bool bError)
5858
{
5959
if (Filter.ShouldSave(GetOwner()))
6060
{

Source/SaveExtension/Private/SaveFilter.cpp

Lines changed: 0 additions & 12 deletions
This file was deleted.

Source/SaveExtension/Private/SaveManager.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ void USaveManager::UnsubscribeFromEvents(const TScriptInterface<ISaveExtensionIn
399399
SubscribedInterfaces.Remove(Interface);
400400
}
401401

402-
void USaveManager::OnSaveBegan(const FSaveFilter& Filter)
402+
void USaveManager::OnSaveBegan(const FSELevelFilter& Filter)
403403
{
404404
IterateSubscribedInterfaces([&Filter](auto* Object) {
405405
check(Object->template Implements<USaveExtensionInterface>());
@@ -413,7 +413,7 @@ void USaveManager::OnSaveBegan(const FSaveFilter& Filter)
413413
});
414414
}
415415

416-
void USaveManager::OnSaveFinished(const FSaveFilter& Filter, const bool bError)
416+
void USaveManager::OnSaveFinished(const FSELevelFilter& Filter, const bool bError)
417417
{
418418
IterateSubscribedInterfaces([&Filter, bError](auto* Object) {
419419
check(Object->template Implements<USaveExtensionInterface>());
@@ -432,7 +432,7 @@ void USaveManager::OnSaveFinished(const FSaveFilter& Filter, const bool bError)
432432
}
433433
}
434434

435-
void USaveManager::OnLoadBegan(const FSaveFilter& Filter)
435+
void USaveManager::OnLoadBegan(const FSELevelFilter& Filter)
436436
{
437437
IterateSubscribedInterfaces([&Filter](auto* Object) {
438438
check(Object->template Implements<USaveExtensionInterface>());
@@ -446,7 +446,7 @@ void USaveManager::OnLoadBegan(const FSaveFilter& Filter)
446446
});
447447
}
448448

449-
void USaveManager::OnLoadFinished(const FSaveFilter& Filter, const bool bError)
449+
void USaveManager::OnLoadFinished(const FSELevelFilter& Filter, const bool bError)
450450
{
451451
IterateSubscribedInterfaces([&Filter, bError](auto* Object) {
452452
check(Object->template Implements<USaveExtensionInterface>());

Source/SaveExtension/Private/SavePreset.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#include "SavePreset.h"
44

5-
#include "SaveFilter.h"
5+
#include "LevelFilter.h"
66
#include "SlotData.h"
77
#include "SlotInfo.h"
88

@@ -27,9 +27,9 @@ void USavePreset::GetSlotNameFromId(int32 Id, FName& Name) const
2727
}
2828
}
2929

30-
FSaveFilter USavePreset::ToFilter() const
30+
FSELevelFilter USavePreset::ToFilter() const
3131
{
32-
FSaveFilter Filter{};
32+
FSELevelFilter Filter{};
3333
Filter.FromPreset(*this);
3434
return Filter;
3535
}

Source/SaveExtension/Private/Serialization/LevelRecords.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,27 @@
77
/////////////////////////////////////////////////////
88
// LevelRecords
99

10-
FName FPersistentLevelRecord::PersistentName{ "Persistent" };
10+
const FName FPersistentLevelRecord::PersistentName{ "Persistent" };
1111

1212

1313
bool FLevelRecord::Serialize(FArchive& Ar)
1414
{
1515
Super::Serialize(Ar);
1616

17+
Ar << bOverrideGeneralFilter;
18+
if (bOverrideGeneralFilter)
19+
{
20+
static UScriptStruct* const LevelFilterType{ FSELevelFilter::StaticStruct() };
21+
LevelFilterType->SerializeItem(Ar, &Filter, nullptr);
22+
}
23+
1724
Ar << LevelScript;
1825
Ar << Actors;
1926

2027
return true;
2128
}
2229

23-
void FLevelRecord::Clean()
30+
void FLevelRecord::CleanRecords()
2431
{
2532
LevelScript = {};
2633
Actors.Empty();

Source/SaveExtension/Private/Serialization/MTTask_SerializeActors.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
// FMTTask_SerializeActors
1616
void FMTTask_SerializeActors::DoWork()
1717
{
18-
if (Filter.bStoreGameInstance)
18+
if (bStoreGameInstance)
1919
{
2020
SerializeGameInstance();
2121
}

Source/SaveExtension/Private/Serialization/SlotDataTask.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,47 @@ USaveManager* USlotDataTask::GetManager() const
4444
return Cast<USaveManager>(GetOuter());
4545
}
4646

47+
void USlotDataTask::BakeAllFilters()
48+
{
49+
SlotData->GeneralLevelFilter.BakeAllowedClasses();
50+
51+
if(SlotData->MainLevel.bOverrideGeneralFilter)
52+
{
53+
SlotData->MainLevel.Filter.BakeAllowedClasses();
54+
}
55+
56+
for(const auto& Level : SlotData->SubLevels)
57+
{
58+
if(Level.bOverrideGeneralFilter)
59+
{
60+
Level.Filter.BakeAllowedClasses();
61+
}
62+
}
63+
}
64+
65+
const FSELevelFilter& USlotDataTask::GetGeneralFilter() const
66+
{
67+
check(SlotData);
68+
return SlotData->GeneralLevelFilter;
69+
}
70+
71+
const FSELevelFilter& USlotDataTask::GetLevelFilter(const FLevelRecord& Level) const
72+
{
73+
if(Level.bOverrideGeneralFilter)
74+
{
75+
return Level.Filter;
76+
}
77+
return GetGeneralFilter();
78+
}
79+
80+
FLevelRecord* USlotDataTask::FindLevelRecord(const ULevelStreaming* Level) const
81+
{
82+
if (!Level)
83+
return &SlotData->MainLevel;
84+
else // Find the Sub-Level
85+
return SlotData->SubLevels.FindByKey(Level);
86+
}
87+
4788
UWorld* USlotDataTask::GetWorld() const
4889
{
4990
return GetOuter()->GetWorld();

Source/SaveExtension/Private/Serialization/SlotDataTask_LevelLoader.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ void USlotDataTask_LevelLoader::OnStart()
1010
{
1111
if (SlotData && StreamingLevel && StreamingLevel->IsLevelLoaded())
1212
{
13+
FLevelRecord* LevelRecord = FindLevelRecord(StreamingLevel);
14+
if (!LevelRecord)
15+
{
16+
Finish(false);
17+
return;
18+
}
19+
20+
GetLevelFilter(*LevelRecord).BakeAllowedClasses();
21+
1322
if (Preset->IsFrameSplitLoad())
1423
{
1524
DeserializeLevelASync(StreamingLevel->GetLoadedLevel(), StreamingLevel);
@@ -26,27 +35,26 @@ void USlotDataTask_LevelLoader::OnStart()
2635

2736
void USlotDataTask_LevelLoader::DeserializeASyncLoop(float StartMS /*= 0.0f*/)
2837
{
29-
FLevelRecord * LevelRecord = FindLevelRecord(CurrentSLevel.Get());
30-
if (!LevelRecord)
31-
{
32-
Finish(false);
33-
return;
34-
}
38+
FLevelRecord& LevelRecord = *FindLevelRecord(CurrentSLevel.Get());
3539

3640
if (StartMS <= 0)
41+
{
3742
StartMS = GetTimeMilliseconds();
43+
}
44+
45+
const auto& Filter = GetLevelFilter(LevelRecord);
3846

3947
// Continue Iterating actors every tick
4048
for (; CurrentActorIndex < CurrentLevelActors.Num(); ++CurrentActorIndex)
4149
{
4250
AActor* Actor{ CurrentLevelActors[CurrentActorIndex].Get() };
4351
if (Actor)
4452
{
45-
DeserializeLevel_Actor(Actor, *LevelRecord);
53+
DeserializeLevel_Actor(Actor, LevelRecord, Filter);
4654

4755
const float CurrentMS = GetTimeMilliseconds();
4856
// If x milliseconds passed, continue on next frame
49-
if (CurrentMS - StartMS >= Filter.MaxFrameMs)
57+
if (CurrentMS - StartMS >= MaxFrameMs)
5058
return;
5159
}
5260
}

Source/SaveExtension/Private/Serialization/SlotDataTask_LevelSaver.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ void USlotDataTask_LevelSaver::OnStart()
1010
{
1111
if (SlotData && StreamingLevel && StreamingLevel->IsLevelLoaded())
1212
{
13+
FLevelRecord* LevelRecord = FindLevelRecord(StreamingLevel);
14+
if (!LevelRecord)
15+
{
16+
Finish(false);
17+
return;
18+
}
19+
20+
GetLevelFilter(*LevelRecord).BakeAllowedClasses();
21+
1322
const int32 NumberOfThreads = FMath::Max(1, FPlatformMisc::NumberOfWorkerThreadsToSpawn());
1423
SerializeLevelSync(StreamingLevel->GetLoadedLevel(), NumberOfThreads, StreamingLevel);
1524

0 commit comments

Comments
 (0)