Save/load: Pre-filter SaveLoad descriptor arrays for current version/mode, for chunks with many objects

This commit is contained in:
Jonathan G Rennison
2019-09-23 17:30:09 +01:00
parent 02bd91477d
commit 0a1c1809ab
9 changed files with 344 additions and 69 deletions

View File

@@ -138,25 +138,53 @@ static const SaveLoad _edge_desc[] = {
SLE_END()
};
std::vector<SaveLoad> _filtered_node_desc;
std::vector<SaveLoad> _filtered_edge_desc;
std::vector<SaveLoad> _filtered_job_desc;
static void FilterDescs()
{
_filtered_node_desc = SlFilterObject(_node_desc);
_filtered_edge_desc = SlFilterObject(_edge_desc);
_filtered_job_desc = SlFilterObject(GetLinkGraphJobDesc());
}
/**
* Save/load a link graph.
* Save a link graph.
* @param lg Link graph to be saved or loaded.
*/
void SaveLoad_LinkGraph(LinkGraph &lg)
void Save_LinkGraph(LinkGraph &lg)
{
uint size = lg.Size();
for (NodeID from = 0; from < size; ++from) {
Node *node = &lg.nodes[from];
SlObject(node, _node_desc);
SlObjectSaveFiltered(node, _filtered_node_desc.data());
/* ... but as that wasted a lot of space we save a sparse matrix now. */
for (NodeID to = from; to != INVALID_NODE; to = lg.edges[from][to].next_edge) {
SlObjectSaveFiltered(&lg.edges[from][to], _filtered_edge_desc.data());
}
}
}
/**
* Load a link graph.
* @param lg Link graph to be saved or loaded.
*/
void Load_LinkGraph(LinkGraph &lg)
{
uint size = lg.Size();
for (NodeID from = 0; from < size; ++from) {
Node *node = &lg.nodes[from];
SlObjectLoadFiltered(node, _filtered_node_desc.data());
if (IsSavegameVersionBefore(SLV_191)) {
/* We used to save the full matrix ... */
for (NodeID to = 0; to < size; ++to) {
SlObject(&lg.edges[from][to], _edge_desc);
SlObjectLoadFiltered(&lg.edges[from][to], _filtered_edge_desc.data());
}
} else {
/* ... but as that wasted a lot of space we save a sparse matrix now. */
for (NodeID to = from; to != INVALID_NODE; to = lg.edges[from][to].next_edge) {
SlObject(&lg.edges[from][to], _edge_desc);
SlObjectLoadFiltered(&lg.edges[from][to], _filtered_edge_desc.data());
}
}
}
@@ -168,10 +196,10 @@ void SaveLoad_LinkGraph(LinkGraph &lg)
*/
static void DoSave_LGRJ(LinkGraphJob *lgj)
{
SlObject(lgj, GetLinkGraphJobDesc());
SlObjectSaveFiltered(lgj, _filtered_job_desc.data());
_num_nodes = lgj->Size();
SlObject(const_cast<LinkGraph *>(&lgj->Graph()), GetLinkGraphDesc());
SaveLoad_LinkGraph(const_cast<LinkGraph &>(lgj->Graph()));
SlObjectSaveFiltered(const_cast<LinkGraph *>(&lgj->Graph()), GetLinkGraphDesc()); // GetLinkGraphDesc has no conditionals
Save_LinkGraph(const_cast<LinkGraph &>(lgj->Graph()));
}
/**
@@ -181,8 +209,8 @@ static void DoSave_LGRJ(LinkGraphJob *lgj)
static void DoSave_LGRP(LinkGraph *lg)
{
_num_nodes = lg->Size();
SlObject(lg, GetLinkGraphDesc());
SaveLoad_LinkGraph(*lg);
SlObjectSaveFiltered(lg, GetLinkGraphDesc()); // GetLinkGraphDesc has no conditionals
Save_LinkGraph(*lg);
}
/**
@@ -190,6 +218,7 @@ static void DoSave_LGRP(LinkGraph *lg)
*/
static void Load_LGRP()
{
FilterDescs();
int index;
while ((index = SlIterateArray()) != -1) {
if (!LinkGraph::CanAllocateItem()) {
@@ -197,9 +226,9 @@ static void Load_LGRP()
NOT_REACHED();
}
LinkGraph *lg = new (index) LinkGraph();
SlObject(lg, GetLinkGraphDesc());
SlObjectLoadFiltered(lg, GetLinkGraphDesc()); // GetLinkGraphDesc has no conditionals
lg->Init(_num_nodes);
SaveLoad_LinkGraph(*lg);
Load_LinkGraph(*lg);
}
}
@@ -208,6 +237,7 @@ static void Load_LGRP()
*/
static void Load_LGRJ()
{
FilterDescs();
int index;
while ((index = SlIterateArray()) != -1) {
if (!LinkGraphJob::CanAllocateItem()) {
@@ -215,14 +245,14 @@ static void Load_LGRJ()
NOT_REACHED();
}
LinkGraphJob *lgj = new (index) LinkGraphJob();
SlObject(lgj, GetLinkGraphJobDesc());
SlObjectLoadFiltered(lgj, _filtered_job_desc.data());
if (SlXvIsFeatureMissing(XSLFI_LINKGRAPH_DAY_SCALE)) {
GetLinkGraphJobDayLengthScaleAfterLoad(lgj);
}
LinkGraph &lg = const_cast<LinkGraph &>(lgj->Graph());
SlObject(&lg, GetLinkGraphDesc());
SlObjectLoadFiltered(&lg, GetLinkGraphDesc()); // GetLinkGraphDesc has no conditionals
lg.Init(_num_nodes);
SaveLoad_LinkGraph(lg);
Load_LinkGraph(lg);
}
}
@@ -267,6 +297,7 @@ void AfterLoadLinkGraphs()
*/
static void Save_LGRP()
{
FilterDescs();
LinkGraph *lg;
FOR_ALL_LINK_GRAPHS(lg) {
SlSetArrayIndex(lg->index);
@@ -279,6 +310,7 @@ static void Save_LGRP()
*/
static void Save_LGRJ()
{
FilterDescs();
LinkGraphJob *lgj;
FOR_ALL_LINK_GRAPH_JOBS(lgj) {
SlSetArrayIndex(lgj->index);