From: <rly...@us...> - 2010-12-24 21:47:15
|
Revision: 6576 http://planeshift.svn.sourceforge.net/planeshift/?rev=6576&view=rev Author: rlydontknow Date: 2010-12-24 21:47:09 +0000 (Fri, 24 Dec 2010) Log Message: ----------- use an array instead of a set for the load list limit the execution of expensive checks if not waiting Modified Paths: -------------- trunk/src/common/bgloader/loader.cpp trunk/src/common/bgloader/loader.h trunk/src/common/bgloader/loader_objects.cpp Modified: trunk/src/common/bgloader/loader.cpp =================================================================== --- trunk/src/common/bgloader/loader.cpp 2010-12-24 21:00:15 UTC (rev 6575) +++ trunk/src/common/bgloader/loader.cpp 2010-12-24 21:47:09 UTC (rev 6576) @@ -45,7 +45,7 @@ BgLoader::BgLoader(iBase *p) : scfImplementationType (this, p), loadCount(0), loadRange(500), validPosition(false), - loadingOffset(0), currRot_h(0), currRot_v(0), resetHitbeam(true) + loadStep(0), currRot_h(0), currRot_v(0), resetHitbeam(true) { } @@ -236,24 +236,31 @@ void BgLoader::ContinueLoading(bool wait) { - // continue loading objects passed via LoadZones - loadedZones.LoadObjects(wait); - if(validPosition) + bool expensiveChecks = (loadStep == 0) || wait; + + if(expensiveChecks) { - UpdatePosition(lastPos, lastSector->GetName(), true); + // checks objects passed via LoadZones + loadedZones.LoadObjects(wait); + + + if(validPosition) + { + // checks regular objects + UpdatePosition(lastPos, lastSector->GetName(), true); + } } // find lingering objects that someone attempted to load but never finished - csSet<csPtrKey<Loadable> >::GlobalIterator it(loadList.GetIterator()); - csArray<csPtrKey<Loadable> > toAbort; - while(it.HasNext()) + for(size_t i = 0; i < loadList.GetSize(); ++i) { - Loadable* l = it.Next(); + Loadable* l = loadList[i]; if(!l->IsChecked()) { if(l->GetLingerCount() > maxLingerCount) { - toAbort.Push(l); + LOADER_DEBUG_MESSAGE("aborting load for lingering object '%s'!\n", l->GetName()); + l->AbortLoad(); } else { @@ -263,16 +270,13 @@ else { l->ResetChecked(); + + // continue loading + l->LoadObject(wait); } } - // abort loading for the objects we found - for(size_t i = 0; i < toAbort.GetSize(); ++i) - { - Loadable* l = toAbort[i]; - LOADER_DEBUG_MESSAGE("aborting load for lingering object '%s'!\n", l->GetName()); - l->AbortLoad(); - } + loadStep = (loadStep + 1) % 10; } void BgLoader::UpdatePosition(const csVector3& pos, const char* sectorName, bool force) Modified: trunk/src/common/bgloader/loader.h =================================================================== --- trunk/src/common/bgloader/loader.h 2010-12-24 21:00:15 UTC (rev 6575) +++ trunk/src/common/bgloader/loader.h 2010-12-24 21:47:09 UTC (rev 6576) @@ -326,7 +326,7 @@ void RegisterPendingObject(Loadable* obj) { ++loadCount; - loadList.Add(obj); + loadList.Push(obj); } // decrease load count - to be used by loadables only @@ -1422,7 +1422,7 @@ ObjectLoader<Zone> loadedZones; // currently loading objects - csSet<csPtrKey<Loadable> > loadList; + csArray<csPtrKey<Loadable> > loadList; // number of objects currently loading size_t loadCount; @@ -1446,8 +1446,8 @@ // The last valid position. csVector3 lastPos; - // The last offset used for mesh loading - size_t loadingOffset; + // current load step - use for ContinueLoading + size_t loadStep; // For world manipulation. csRef<iMeshWrapper> selectedMesh; Modified: trunk/src/common/bgloader/loader_objects.cpp =================================================================== --- trunk/src/common/bgloader/loader_objects.cpp 2010-12-24 21:00:15 UTC (rev 6575) +++ trunk/src/common/bgloader/loader_objects.cpp 2010-12-24 21:47:09 UTC (rev 6576) @@ -278,11 +278,6 @@ status = GetParent()->GetLoader()->LoadNode(path, data, 0, sector->object); } - if(wait) - { - status->Wait(); - } - ready = TrivialLoadable::LoadObject(wait); } @@ -301,6 +296,11 @@ bool BgLoader::Portal::LoadObject(bool wait) { + if(mObject.IsValid()) + { + return true; + } + iSector* target = targetSector->object; if(autoresolve) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |