diff --git a/source/cRoot.cpp b/source/cRoot.cpp index 514a00764..df89eb966 100644 --- a/source/cRoot.cpp +++ b/source/cRoot.cpp @@ -18,6 +18,7 @@ #include "items/Item.h" #include "squirrelbindings/SquirrelFunctions.h" #include "squirrelbindings/SquirrelBindings.h" +#include "cChunk.h" #include "../iniFile/iniFile.h" @@ -421,3 +422,55 @@ bool cRoot::ForEachPlayer(cPlayerListCallback & a_Callback) + +void cRoot::LogChunkStats(void) +{ + int SumNumValid = 0; + int SumNumDirty = 0; + int SumNumInLighting = 0; + int SumNumInGenerator = 0; + int SumMem = 0; + for (WorldMap::iterator itr = m_pState->WorldsByName.begin(), end = m_pState->WorldsByName.end(); itr != end; ++itr) + { + cWorld * World = itr->second; + int NumInGenerator = World->GetGeneratorQueueLength(); + int NumInSaveQueue = World->GetStorageSaveQueueLength(); + int NumInLoadQueue = World->GetStorageLoadQueueLength(); + int NumValid = 0; + int NumDirty = 0; + int NumInLighting = 0; + World->GetChunkStats(NumValid, NumDirty, NumInLighting); + LOG("World %s:", World->GetName().c_str()); + LOG(" Num loaded chunks: %d", NumValid); + LOG(" Num dirty chunks: %d", NumDirty); + LOG(" Num chunks in lighting queue: %d", NumInLighting); + LOG(" Num chunks in generator queue: %d", NumInGenerator); + LOG(" Num chunks in storage load queue: %d", NumInLoadQueue); + LOG(" Num chunks in storage save queue: %d", NumInSaveQueue); + int Mem = NumValid * sizeof(cChunk); + LOG(" Memory used by chunks: %d KiB (%d MiB)", (Mem + 1023) / 1024, (Mem + 1024 * 1024 - 1) / (1024 * 1024)); + LOG(" Per-chunk memory size breakdown:"); + LOG(" block types: %6d bytes (%3d KiB)", sizeof(cChunkDef::BlockTypes), (sizeof(cChunkDef::BlockTypes) + 1023) / 1024); + LOG(" block metadata: %6d bytes (%3d KiB)", sizeof(cChunkDef::BlockNibbles), (sizeof(cChunkDef::BlockNibbles) + 1023) / 1024); + LOG(" block lighting: %6d bytes (%3d KiB)", 2 * sizeof(cChunkDef::BlockNibbles), (2 * sizeof(cChunkDef::BlockNibbles) + 1023) / 1024); + LOG(" heightmap: %6d bytes (%3d KiB)", sizeof(cChunkDef::HeightMap), (sizeof(cChunkDef::HeightMap) + 1023) / 1024); + LOG(" biomemap: %6d bytes (%3d KiB)", sizeof(cChunkDef::BiomeMap), (sizeof(cChunkDef::BiomeMap) + 1023) / 1024); + int Rest = sizeof(cChunk) - sizeof(cChunkDef::BlockTypes) - 3 * sizeof(cChunkDef::BlockNibbles) - sizeof(cChunkDef::HeightMap) - sizeof(cChunkDef::BiomeMap); + LOG(" other: %6d bytes (%3d KiB)", Rest, (Rest + 1023) / 1024); + SumNumValid += NumValid; + SumNumDirty += NumDirty; + SumNumInLighting += NumInLighting; + SumNumInGenerator += NumInGenerator; + SumMem += Mem; + } + LOG("Totals:"); + LOG(" Num loaded chunks: %d", SumNumValid); + LOG(" Num dirty chunks: %d", SumNumDirty); + LOG(" Num chunks in lighting queue: %d", SumNumInLighting); + LOG(" Num chunks in generator queue: %d", SumNumInGenerator); + LOG(" Memory used by chunks: %d KiB (%d MiB)", (SumMem + 1023) / 1024, (SumMem + 1024 * 1024 - 1) / (1024 * 1024)); +} + + + + diff --git a/source/cRoot.h b/source/cRoot.h index fc12d876c..9a8520642 100644 --- a/source/cRoot.h +++ b/source/cRoot.h @@ -44,6 +44,9 @@ public: /// Calls the callback for each world; returns true if the callback didn't abort (return true) bool ForEachWorld(cWorldListCallback & a_Callback); // >> Exported in ManualBindings << + /// Logs chunkstats for each world and totals + void LogChunkStats(void); + cMonsterConfig * GetMonsterConfig() { return m_MonsterConfig; } cGroupManager * GetGroupManager (void) { return m_GroupManager; } // tolua_export diff --git a/source/cServer.cpp b/source/cServer.cpp index 78bfc8953..1724dea40 100644 --- a/source/cServer.cpp +++ b/source/cServer.cpp @@ -21,7 +21,6 @@ #include "cFurnaceRecipe.h" #include "cTracer.h" #include "cWebAdmin.h" -#include "cChunk.h" #include "MersenneTwister.h" @@ -528,31 +527,7 @@ void cServer::ServerCommand( const char * a_Cmd ) } if (split[0].compare("chunkstats") == 0) { - // TODO: For each world - int NumValid = 0; - int NumDirty = 0; - int NumInLighting = 0; - cWorld * World = cRoot::Get()->GetDefaultWorld(); - int NumInGenerator = World->GetGeneratorQueueLength(); - int NumInSaveQueue = World->GetStorageSaveQueueLength(); - int NumInLoadQueue = World->GetStorageLoadQueueLength(); - World->GetChunkStats(NumValid, NumDirty, NumInLighting); - LOG("Num loaded chunks: %d", NumValid); - LOG("Num dirty chunks: %d", NumDirty); - LOG("Num chunks in lighting queue: %d", NumInLighting); - LOG("Num chunks in generator queue: %d", NumInGenerator); - LOG("Num chunks in storage load queue: %d", NumInLoadQueue); - LOG("Num chunks in storage save queue: %d", NumInSaveQueue); - int Mem = NumValid * sizeof(cChunk); - LOG("Memory used by chunks: %d KiB (%d MiB)", (Mem + 1023) / 1024, (Mem + 1024 * 1024 - 1) / (1024 * 1024)); - LOG("Per-chunk memory size breakdown:"); - LOG(" block types: %6d bytes (%3d KiB)", sizeof(cChunkDef::BlockTypes), (sizeof(cChunkDef::BlockTypes) + 1023) / 1024); - LOG(" block metadata: %6d bytes (%3d KiB)", sizeof(cChunkDef::BlockNibbles), (sizeof(cChunkDef::BlockNibbles) + 1023) / 1024); - LOG(" block lighting: %6d bytes (%3d KiB)", 2 * sizeof(cChunkDef::BlockNibbles), (2 * sizeof(cChunkDef::BlockNibbles) + 1023) / 1024); - LOG(" heightmap: %6d bytes (%3d KiB)", sizeof(cChunkDef::HeightMap), (sizeof(cChunkDef::HeightMap) + 1023) / 1024); - LOG(" biomemap: %6d bytes (%3d KiB)", sizeof(cChunkDef::BiomeMap), (sizeof(cChunkDef::BiomeMap) + 1023) / 1024); - int Rest = sizeof(cChunk) - sizeof(cChunkDef::BlockTypes) - 3 * sizeof(cChunkDef::BlockNibbles) - sizeof(cChunkDef::HeightMap) - sizeof(cChunkDef::BiomeMap); - LOG(" other: %6d bytes (%3d KiB)", Rest, (Rest + 1023) / 1024); + cRoot::Get()->LogChunkStats(); return; }