Trying to make the CRC less often.

This commit is contained in:
titiger 2021-01-14 00:27:41 +01:00
parent a1d8ea91a2
commit 047ae0daaa
2 changed files with 86 additions and 59 deletions

View File

@ -119,6 +119,9 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu,
lastCheckedCRCTechtreeName = "";
lastCheckedCRCMapName = "";
lastRecalculatedCRCTilesetName = "";
lastRecalculatedCRCTechtreeName = "";
initTime= time(NULL); // now
lastCheckedCRCTilesetValue = 0;
@ -2869,6 +2872,10 @@ void MenuStateCustomGame::update() {
if(serverInterface->getSlot(i,true) != NULL &&
serverInterface->getSlot(i,true)->getNetworkGameDataSynchCheckOkTech() == false) {
{
// Ensure local CRC cache is correct
refreshCRCCache(serverInterface->getGameSettingsPtr());
}
label = label + " techtree";
if(serverInterface->getSlot(i,true)->getReceivedDataSynchCheck() == true) {
@ -3938,65 +3945,7 @@ void MenuStateCustomGame::copyToGameSettings(GameSettings *gameSettings,bool for
gameSettings->setNetworkFramePeriod(config.getInt("NetworkSendFrameCount","20"));
gameSettings->setNetworkPauseGameForLaggedClients(((checkBoxNetworkPauseGameForLaggedClients.getValue() == true)));
if( gameSettings->getTileset() != "") {
// Check if we have calculated the crc since menu_state started
bool forceRefresh = false;
time_t lastUpdateDate = getFolderTreeContentsCheckSumRecursivelyLastGenerated(config.getPathListForType(ptTilesets,""), string("/") + gameSettings->getTileset() + string("/*"), ".xml");
if(difftime(lastUpdateDate,initTime) <0 ) {
forceRefresh=true;
}
if(lastCheckedCRCTilesetName != gameSettings->getTileset()) {
//console.addLine("Checking tileset CRC [" + gameSettings->getTileset() + "]");
lastCheckedCRCTilesetValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTilesets,""), string("/") + gameSettings->getTileset() + string("/*"), ".xml", NULL,forceRefresh);
lastCheckedCRCTilesetName = gameSettings->getTileset();
}
gameSettings->setTilesetCRC(lastCheckedCRCTilesetValue);
}
if(config.getBool("DisableServerLobbyTechtreeCRCCheck","false") == false) {
if(gameSettings->getTech() != "") {
// Check if we have calculated the crc since menu_state started
bool forceRefresh = false;
time_t lastUpdateDate = getFolderTreeContentsCheckSumRecursivelyLastGenerated(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml");
if(difftime(lastUpdateDate,initTime) <0 ) {
forceRefresh=true;
}
if(lastCheckedCRCTechtreeName != gameSettings->getTech()) {
//console.addLine("Checking techtree CRC [" + gameSettings->getTech() + "]");
lastCheckedCRCTechtreeValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml", NULL,forceRefresh);
reloadFactions(true,(checkBoxScenario.getValue() == true ? scenarioFiles[listBoxScenario.getSelectedItemIndex()] : ""));
factionCRCList.clear();
for(unsigned int factionIdx = 0; factionIdx < factionFiles.size(); ++factionIdx) {
string factionName = factionFiles[factionIdx];
if(factionName != GameConstants::RANDOMFACTION_SLOTNAME &&
factionName != GameConstants::OBSERVER_SLOTNAME) {
//factionCRC = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/factions/" + factionName + "/*", ".xml", NULL, true);
uint32 factionCRC = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/factions/" + factionName + "/*", ".xml", NULL,forceRefresh);
factionCRCList.push_back(make_pair(factionName,factionCRC));
}
}
//console.addLine("Found factions: " + intToStr(factionCRCList.size()));
lastCheckedCRCTechtreeName = gameSettings->getTech();
}
gameSettings->setFactionCRCList(factionCRCList);
gameSettings->setTechCRC(lastCheckedCRCTechtreeValue);
}
}
if(gameSettings->getMap() != "") {
if(lastCheckedCRCMapName != gameSettings->getMap()) {
Checksum checksum;
string file = Config::getMapPath(gameSettings->getMap(),"",false);
//console.addLine("Checking map CRC [" + file + "]");
checksum.addFile(file);
lastCheckedCRCMapValue = checksum.getSum();
lastCheckedCRCMapName = gameSettings->getMap();
}
gameSettings->setMapCRC(lastCheckedCRCMapValue);
}
setCRCsToGameSettings(gameSettings);
if(this->headlessServerMode == true) {
time_t clientConnectedTime = 0;
@ -4361,6 +4310,79 @@ void MenuStateCustomGame::setupUIFromGameSettings(const GameSettings &gameSettin
}
// ============ PRIVATE ===========================
void MenuStateCustomGame::refreshCRCCache(GameSettings *gameSettings){
Config &config = Config::getInstance();
if( gameSettings->getTileset() != "" && lastRecalculatedCRCTilesetName != gameSettings->getTileset() ) {
lastRecalculatedCRCTilesetName=gameSettings->getTileset() ;
// Check if we have calculated the crc since menu_state started
time_t lastUpdateDate = getFolderTreeContentsCheckSumRecursivelyLastGenerated(config.getPathListForType(ptTilesets,""), string("/") + gameSettings->getTileset() + string("/*"), ".xml");
if(difftime(lastUpdateDate,initTime) <0 ) {
getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTilesets,""), string("/") + gameSettings->getTileset() + string("/*"), ".xml", NULL,false);
}
}
if(gameSettings->getTech() != "" && lastRecalculatedCRCTechtreeName != gameSettings->getTech()) {
lastRecalculatedCRCTechtreeName=gameSettings->getTech();
// Check if we have calculated the crc since menu_state started
time_t lastUpdateDate = getFolderTreeContentsCheckSumRecursivelyLastGenerated(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml");
if(difftime(lastUpdateDate,initTime) <0 ) {
getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml", NULL,true);
}
}
// no need to deal with map CRC this is always calculated
}
void MenuStateCustomGame::setCRCsToGameSettings(GameSettings *gameSettings){
Config &config = Config::getInstance();
if( gameSettings->getTileset() != "") {
if(lastCheckedCRCTilesetName != gameSettings->getTileset()) {
//console.addLine("Checking tileset CRC [" + gameSettings->getTileset() + "]");
lastCheckedCRCTilesetValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTilesets,""), string("/") + gameSettings->getTileset() + string("/*"), ".xml", NULL,false);
lastCheckedCRCTilesetName = gameSettings->getTileset();
}
gameSettings->setTilesetCRC(lastCheckedCRCTilesetValue);
}
if(config.getBool("DisableServerLobbyTechtreeCRCCheck","false") == false) {
if(gameSettings->getTech() != "") {
if(lastCheckedCRCTechtreeName != gameSettings->getTech()) {
//console.addLine("Checking techtree CRC [" + gameSettings->getTech() + "]");
lastCheckedCRCTechtreeValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml", NULL,false);
reloadFactions(true,(checkBoxScenario.getValue() == true ? scenarioFiles[listBoxScenario.getSelectedItemIndex()] : ""));
factionCRCList.clear();
for(unsigned int factionIdx = 0; factionIdx < factionFiles.size(); ++factionIdx) {
string factionName = factionFiles[factionIdx];
if(factionName != GameConstants::RANDOMFACTION_SLOTNAME &&
factionName != GameConstants::OBSERVER_SLOTNAME) {
//factionCRC = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/factions/" + factionName + "/*", ".xml", NULL, true);
uint32 factionCRC = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/factions/" + factionName + "/*", ".xml", NULL,false);
factionCRCList.push_back(make_pair(factionName,factionCRC));
}
}
//console.addLine("Found factions: " + intToStr(factionCRCList.size()));
lastCheckedCRCTechtreeName = gameSettings->getTech();
}
gameSettings->setFactionCRCList(factionCRCList);
gameSettings->setTechCRC(lastCheckedCRCTechtreeValue);
}
}
if(gameSettings->getMap() != "") {
if(lastCheckedCRCMapName != gameSettings->getMap()) {
Checksum checksum;
string file = Config::getMapPath(gameSettings->getMap(),"",false);
//console.addLine("Checking map CRC [" + file + "]");
checksum.addFile(file);
lastCheckedCRCMapValue = checksum.getSum();
lastCheckedCRCMapName = gameSettings->getMap();
}
gameSettings->setMapCRC(lastCheckedCRCMapValue);
}
}
void MenuStateCustomGame::setSmallFont(GraphicLabel l){
l.setFont(CoreData::getInstance().getDisplayFontSmall());
l.setFont3D(CoreData::getInstance().getDisplayFontSmall3D());

View File

@ -212,6 +212,9 @@ private:
string lastCheckedCRCTechtreeName;
string lastCheckedCRCMapName;
string lastRecalculatedCRCTilesetName;
string lastRecalculatedCRCTechtreeName;
time_t initTime;
uint32 lastCheckedCRCTilesetValue;
@ -263,6 +266,8 @@ public:
virtual bool isVideoPlaying();
private:
void setCRCsToGameSettings(GameSettings *gameSettings);
void refreshCRCCache(GameSettings *gameSettings);
void setSmallFont(GraphicLabel l);
void lastPlayerDisconnected();
bool hasNetworkGameSettings();