Save/load: Pre-filter SaveLoad descriptor arrays for current version/mode, for chunks with many objects
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user