28
28
#include " zip.h"
29
29
#include " unzip.h"
30
30
31
+ #include " tracy/Tracy.hpp"
32
+
31
33
#include " SDL3/SDL_surface.h"
32
34
#include < SDL3_image/SDL_image.h>
33
35
@@ -85,6 +87,8 @@ bool ActivityMan::SaveCurrentGame(const std::string& fileName) {
85
87
m_SaveGameTask.wait ();
86
88
}
87
89
90
+ ZoneScopedN (" Save Game" );
91
+
88
92
Scene* scene = g_SceneMan.GetScene ();
89
93
GAScripted* activity = dynamic_cast <GAScripted*>(GetActivity ());
90
94
@@ -93,6 +97,12 @@ bool ActivityMan::SaveCurrentGame(const std::string& fileName) {
93
97
return false ;
94
98
}
95
99
100
+ // Get BITMAPS so save into our zip, do this async so we can copy the scene info at the same time
101
+ std::vector<SceneLayerInfo>* sceneLayerInfos = new std::vector<SceneLayerInfo>();
102
+ std::future<void > copyBitmaps = g_ThreadMan.GetBackgroundThreadPool ().submit ([&]() {
103
+ *sceneLayerInfos = std::move (scene->GetCopiedSceneLayerBitmaps ());
104
+ });
105
+
96
106
// We need a copy of our scene, because we have to do some fixup to remove PLACEONLOAD items and only keep the current MovableMan state.
97
107
std::unique_ptr<Scene> modifiableScene (dynamic_cast <Scene*>(scene->Clone ()));
98
108
@@ -153,11 +163,6 @@ bool ActivityMan::SaveCurrentGame(const std::string& fileName) {
153
163
indexWriter->NewPropertyWithValue (" ActivityName" , activity->GetPresetName ());
154
164
indexWriter->NewPropertyWithValue (" OriginalScenePresetName" , scene->GetPresetName ());
155
165
156
- // Get BITMAPS so save into our zip
157
- // I tried std::moving this into the function directly but threadpool really doesn't like that
158
- std::vector<SceneLayerInfo>* sceneLayerInfos = new std::vector<SceneLayerInfo>();
159
- *sceneLayerInfos = std::move (scene->GetCopiedSceneLayerBitmaps ());
160
-
161
166
auto saveWriterData = [fileName, sceneLayerInfos, indexWriter](Writer* mainWriter) {
162
167
// Create zip sav file
163
168
zipFile zippedSaveFile = zipOpen ((g_PresetMan.GetFullModulePath (c_UserScriptedSavesModuleName) + " /" + fileName + " .ccsave" ).c_str (), APPEND_STATUS_CREATE);
@@ -242,6 +247,8 @@ bool ActivityMan::SaveCurrentGame(const std::string& fileName) {
242
247
delete sceneLayerInfos;
243
248
};
244
249
250
+ copyBitmaps.wait ();
251
+
245
252
// For some reason I can't std::move a unique ptr in, so just releasing and deleting manually...
246
253
m_SaveGameTask = g_ThreadMan.GetBackgroundThreadPool ().submit (saveWriterData, writer.release ());
247
254
0 commit comments