00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <sstream>
00012
00013 #include "memory-measurement.h"
00014 #include "memsize_interface.h"
00015 #include "iconrepository.h"
00016
00017 #include "gamemap.h"
00018
00019
00020
00021 void MemoryMeasurement::measureTypes()
00022 {
00023
00024 Node* node = new Node( "Type Repositories" );
00025 root.add( node );
00026
00027 node->add( measure( vehicleTypeRepository ));
00028 node->add( measure( terrainTypeRepository ));
00029 node->add( measure( objectTypeRepository ));
00030 node->add( measure( buildingTypeRepository ));
00031
00032
00033 }
00034
00035
00036 void MemoryMeasurement::measure( GameMap* gamemap )
00037 {
00038 Node* node = new Node( "Current Map" );
00039 root.add( node );
00040 node->usage = gamemap->getMemoryFootprint();
00041
00042 Node* buildings = new Node("Buildings");
00043 node->add( buildings );
00044 Node* units = new Node("Units");
00045 node->add( units );
00046
00047 for ( int i = 0; i < gamemap->getPlayerCount(); ++i ) {
00048 Player& p = gamemap->getPlayer(i);
00049 for ( Player::VehicleList::iterator i = p.vehicleList.begin(); i != p.vehicleList.end(); ++i )
00050 units->usage += (*i)->getMemoryFootprint();
00051
00052 for ( Player::BuildingList::iterator i = p.buildingList.begin(); i != p.buildingList.end(); ++i )
00053 buildings->usage += (*i)->getMemoryFootprint();
00054 }
00055
00056 Node* fields = new Node("Fields");
00057 node->add( fields);
00058
00059
00060 Node* objects = new Node("Objects");
00061 fields->add(objects);
00062
00063 for ( int y = 0; y < gamemap->ysize; ++y )
00064 for ( int x = 0; x < gamemap->xsize; ++x ) {
00065 tfield* fld = gamemap->getField(x,y);
00066 fields->usage += fld->getMemoryFootprint();
00067 objects->usage += sizeof( Object ) * fld->objects.size();
00068 }
00069
00070
00071 }
00072
00073 void MemoryMeasurement::measureIcons()
00074 {
00075 Node* node = new Node( "Global Images" );
00076 root.add( node );
00077 node->usage = IconRepository::getMemoryFootprint();
00078 }
00079
00080
00081
00082 int MemoryMeasurement::Node::sum()
00083 {
00084 int sum = usage;
00085 for ( deallocating_vector<Node*>::iterator i = childs.begin(); i != childs.end(); ++i )
00086 sum += (*i)->sum();
00087 return sum;
00088 }
00089
00090
00091 ASCString MemoryMeasurement::Node::prettyPrint( int indent )
00092 {
00093 ASCString result;
00094 result += "#indent=" + ASCString::toString(indent*20) + "," + ASCString::toString(indent*20) + "#";
00095 result += name + ": " + ASCString::toString(usage/1024) + " / " + ASCString::toString( sum()/1024) + "\n";
00096 for ( deallocating_vector<Node*>::iterator i = childs.begin(); i != childs.end(); ++i )
00097 result += (*i)->prettyPrint( indent + 1);
00098 return result;
00099 }
00100
00101
00102
00103 template<class T>
00104 MemoryMeasurement::Node* MemoryMeasurement::measure( ItemRepository<T>& repository )
00105 {
00106
00107 Node* node = new Node( repository.getTypeName() );
00108
00109 node->usage += for_each ( repository.getVector().begin(), repository.getVector().end(), MemorySum<T>() ).size;
00110
00111 return node;
00112 }
00113
00114
00115
00116 template<class T>
00117 struct ObjectStorage : public unary_function<T, void>
00118 {
00119 static bool compare( const pair<int,int>& a1, const pair<int,int>& a2 )
00120 {
00121 return a1.second > a2.second;
00122 }
00123
00124 typedef vector< pair<int,int> > Storage;
00125 Storage storage;
00126 void operator() (const T& x) { storage.push_back( make_pair(x->id, getMemoryFootprint(*x))); };
00127 ASCString print()
00128 {
00129 sort( storage.begin(), storage.end(), &compare );
00130
00131 ASCString s;
00132 for ( Storage::iterator i = storage.begin(); i != storage.end(); ++i ) {
00133 ObjectType* o = objectTypeRepository.getObject_byID(i->first);
00134 s += ASCString::toString(i->second/1024) + " " + o->name + "(ID: " + ASCString::toString(i->first) + "; " + o->filename + ")\n";
00135 }
00136
00137 return s;
00138 }
00139 };
00140
00141
00142
00143 ASCString MemoryMeasurement::getResult()
00144 {
00145 ASCString result = "#fontsize=16#Memory Footprint\n#fontsize=12#all sizes in kB\n\n";
00146 result += root.prettyPrint(0);
00147
00148 result += "#indent=0,0#";
00149
00150 result += "\n\n#fontsize=16#Objects#fontsize=12#\n\n";
00151
00152
00153 result += for_each ( objectTypeRepository.getVector().begin(), objectTypeRepository.getVector().end(), ObjectStorage<ObjectType*>() ).print();
00154 return result;
00155 }
00156
00157
00158
00159
00160